相关疑难解决方法(0)

什么时候应该更喜欢Kotlin扩展功能?

在Kotlin中,具有至少一个参数的函数可以定义为常规非成员函数,也可以定义为扩展函数,其中一个参数是接收者.

对于范围界定,似乎没有区别:两者都可以在类和其他函数内部或外部声明,并且两者都可以或不可以具有相同的可见性修饰符.

语言参考似乎不建议在不同情况下使用常规函数或扩展函数.

所以,我的问题是:扩展功能何时优于常规非成员功能?当常规的扩展?

foo.bar(baz, baq)VS bar(foo, baz, baq).

它只是一个函数语义的提示(接收器肯定是焦点)或是否有使用扩展函数使代码更清洁/开辟机会的情况?

code-structure kotlin

52
推荐指数
3
解决办法
4238
查看次数

在Kotlin中,如何将扩展方法添加到另一个类,但只在某个上下文中可见?

在Kotlin中,我想将扩展方法添加到类中,例如添加到类中Entity.但我只想Entity在交易中看到这些扩展,否则隐藏.例如,如果我定义这些类和扩展:

interface Entity {}

fun Entity.save() {}
fun Entity.delete() {}

class Transaction {
    fun start() {}
    fun commit() {}
    fun rollback() {}
}
Run Code Online (Sandbox Code Playgroud)

我现在可以叫意外save(),并delete()在任何时候,但我只希望他们可以在后start()一交易后不再commit()或rollback()?目前我可以这样做,这是错误的:

someEntity.save()       // DO NOT WANT TO ALLOW HERE
val tx = Transaction()
tx.start()
someEntity.save()       // YES, ALLOW
tx.commit()
someEntity.delete()     // DO NOT WANT TO ALLOW HERE
Run Code Online (Sandbox Code Playgroud)

如何使它们在正确的上下文中显示和消失?

注意: 这个问题是由作者故意编写和回答的(自答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.其他答案也欢迎,有很多样式如何回答这个问题!

dsl builder kotlin

21
推荐指数
2
解决办法
3024
查看次数

标签 统计

kotlin ×2

builder ×1

code-structure ×1

dsl ×1