在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来说是不准确的.其他答案也欢迎,有很多样式如何回答这个问题!
我Math在Kotlin中添加了一个函数,但是我无法使用它,我之前使用它MutableList并且它有效但我无法用Math类来完成它.
fun Math.divideWithSubtract(num1: Int, num2: Int) =
Math.exp(Math.log(num1.toDouble())) - Math.exp(Math.log(num2.toDouble()))
Run Code Online (Sandbox Code Playgroud) 我知道在Kotlin中使用扩展函数来扩展类的功能(例如,来自库或API的功能).
但是,在代码可读性/结构方面,使用扩展函数是否有任何优势:
class Foo { ... }
fun Foo.bar() {
// Some stuff
}
Run Code Online (Sandbox Code Playgroud)
与成员函数相反:
class Foo {
...
fun bar() {
// Some stuff
}
}
Run Code Online (Sandbox Code Playgroud)
?
有推荐的做法吗?
在 Kotlin 中可以有两种编写辅助方法的方法
首先是
object Helper {
fun doSomething(a: Any, b: Any): Any {
// Do some businesss logic and return result
}
}
Run Code Online (Sandbox Code Playgroud)
或者干脆写这个
fun doSomething(a: Any, b: Any): Any {
// Do some businesss logic and return result
}
Run Code Online (Sandbox Code Playgroud)
在 Helper.kt 类中。
所以我的问题是在性能和可维护性方面哪个更好,为什么?