LINUX.ORG.RU

История изменений

Исправление qrck, (текущая версия) :

В случае с Kotlin дело не только в том, что можно не писать «sb.», а в том, что код исполняемый внутри лямбды будет исполняться в определенном контексте, окруженный определенными конкретными элементами.

Например для работы с sqlite базой на андроиде, если мы хотим облегчить обертку в транзакции, вместо Java кода

db.beginTransaction()
try {
   db.delete("users", "first name = ?", new String[] { "Jake" });
   db.setTransactionSuccessful();
} 
finally {
   db.endTransaction();
}

Можно определить extension-метод:

inline fun SQLiteDatabase.inTransaction(func: SQLiteDatabase.() -> Unit) 
{
   beginTransaction()
   try {
      func()
      setTransactionSuccessful()
   } 
   finally {
      endTransaction()
   }
}

И потом использовать его вот так:

db.inTransaction {
   delete("users", "first name = ?", arrayOf("Jake" ));
}

Существенно упрощает жизнь, куда меньше шансы что в одном каком-то конкретном месте будет забыт вызов или случайно порядок выйдет не правильный. При этом в плане байткода скомпилированного код выходит 1-в-1 такой-же что и оригинальный код на Java (для этого inline там).

Или можно например создать класс-враппер, который будет гарантировать что доступ к внутреннему обьекту можно получить только заблокировав его, тем самым исключая случайный доступ без блокировки:


data class Lock<T>(private val obj: T) 
{
   public fun acquire(func: (T) -> Unit)
   {
      synchronized (obj) {
         func(obj)
      }
   }
}

val readerLock = Lock(JsonReader(stream))

readerLock.aquire {
   println(it.readString())
}

от «it» внутри последней лямбды я специально не стал избавлятся, это можно сделать если заменить

public fun acquire(func: (T) -> Unit)

на

public fun acquire(func: T.() -> Unit)

Исправление qrck, :

В случае с Kotlin дело не только в том, что можно не писать «sb.», а в том, что код исполняемый внутри лямбды будет исполняться в определенном контексте, окруженный определенными конкретными элементами.

Например для работы с sqlite базой на андроиде, если мы хотим облегчить обертку в транзакции, вместо Java кода

db.beginTransaction()
try {
   db.delete("users", "first name = ?", new String[] { "Jake" });
   db.setTransactionSuccessful();
} 
finally {
   db.endTransaction();
}

Можно определить extension-метод:

inline fun SQLiteDatabase.inTransaction(func: SQLiteDatabase.() -> Unit) 
{
   beginTransaction()
   try {
      func()
      setTransactionSuccessful()
   } 
   finally {
      endTransaction()
   }
}

И потом использовать его вот так:

db.inTransaction {
   delete("users", "first name = ?", arrayOf("Jake" ));
}

Существенно упрощает жизнь, куда меньше шансы что в одном каком-то конкретном месте будет забыл вызов или случайно порядок выйдет не правильный. При этом в плане байткода скомпилированного код выходит 1-в-1 такой-же что и оригинальный код на Java (для этого inline там).

Или можно например создать класс-враппер, который будет гарантировать что доступ к внутреннему обьекту можно получить только заблокировав его, тем самым исключая случайный доступ без блокировки:


data class Lock<T>(private val obj: T) 
{
   public fun acquire(func: (T) -> Unit)
   {
      synchronized (obj) {
         func(obj)
      }
   }
}

val readerLock = Lock(JsonReader(stream))

readerLock.aquire {
   println(it.readString())
}

от «it» внутри последней лямбды я специально не стал избавлятся, это можно сделать если заменить

public fun acquire(func: (T) -> Unit)

на

public fun acquire(func: T.() -> Unit)

Исправление qrck, :

В случае с Kotlin дело не только в том, что можно не писать «sb.», а в том, что код исполняемый внутри лямбды будет исполняться в определенном контексте, окруженный определенными конкретными элементами.

Например для работы с sqlite базой на андроиде, если мы хотим облегчить обертку в транзакции, вместо Java кода

db.beginTransaction()
try {
   db.delete("users", "first name = ?", new String[] { "Jake" });
   db.setTransactionSuccessful();
} 
finally {
   db.endTransaction();
}

Можно определить extension-метод:

inline fun SQLiteDatabase.inTransaction(func: SQLiteDatabase.() -> Unit) 
{
   beginTransaction()
   try {
      func()
      setTransactionSuccessful()
   } 
   finally {
      endTransaction()
   }
}

И потом использовать его вот так:

db.inTransaction {
   delete("users", "first name = ?", arrayOf("Jake ));
}

Существенно упрощает жизнь, куда меньше шансы что в одном каком-то конкретном месте будет забыл вызов или случайно порядок выйдет не правильный. При этом в плане байткода скомпилированного код выходит 1-в-1 такой-же что и оригинальный код на Java (для этого inline там).

Или можно например создать класс-враппер, который будет гарантировать что доступ к внутреннему обьекту можно получить только заблокировав его, тем самым исключая случайный доступ без блокировки:


data class Lock<T>(private val obj: T) 
{
   public fun acquire(func: (T) -> Unit)
   {
      synchronized (obj) {
         func(obj)
      }
   }
}

val readerLock = Lock(JsonReader(stream))

readerLock.aquire {
   println(it.readString())
}

от «it» внутри последней лямбды я специально не стал избавлятся, это можно сделать если заменить

public fun acquire(func: (T) -> Unit)

на

public fun acquire(func: T.() -> Unit)

Исходная версия qrck, :

В случае с Kotlin дело не только в том, что можно не писать «sb.», а в том, что код исполняемый внутри лямбды будет исполняться в определенном контексте, окруженный определенными конкретными элементами.

Например для работы с sqlite базой на андроиде, если мы хотим облегчить обертку в транзакции, вместо Java кода

db.beginTransaction()
try {
   db.delete("users", "first name = ?", new String[] { "Jake });
   db.setTransactionSuccessful();
} 
finally {
   db.endTransaction();
}

Можно определить extension-метод:

inline fun SQLiteDatabase.inTransaction(func: SQLiteDatabase.() -> Unit) 
{
   beginTransaction()
   try {
      func()
      setTransactionSuccessful()
   } 
   finally {
      endTransaction()
   }
}

И потом использовать его вот так:

db.inTransaction {
   delete("users", "first name = ?", arrayOf("Jake ));
}

Существенно упрощает жизнь, куда меньше шансы что в одном каком-то конкретном месте будет забыл вызов или случайно порядок выйдет не правильный. При этом в плане байткода скомпилированного код выходит 1-в-1 такой-же что и оригинальный код на Java (для этого inline там).

Или можно например создать класс-враппер, который будет гарантировать что доступ к внутреннему обьекту можно получить только заблокировав его, тем самым исключая случайный доступ без блокировки:


data class Lock<T>(private val obj: T) 
{
   public fun acquire(func: (T) -> Unit)
   {
      synchronized (obj) {
         func(obj)
      }
   }
}

val readerLock = Lock(JsonReader(stream))

readerLock.aquire {
   println(it.readString())
}

от «it» внутри последней лямбды я специально не стал избавлятся, это можно сделать если заменить

public fun acquire(func: (T) -> Unit)

на

public fun acquire(func: T.() -> Unit)