История изменений
Исправление
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)