Shr*_* Ye 1 overriding properties constants kotlin
Kotlin为属性覆盖提供支持。我想知道什么是重写属性为常数值的最佳方法。
更具体地说,假设val在超类或接口中声明了抽象属性:
// In a superclass or an interface
abstract val num : Int
Run Code Online (Sandbox Code Playgroud)
据我所知,在其子类中至少有两种方法可以覆盖它:
// In its subclass
override val num : Int = 0
Run Code Online (Sandbox Code Playgroud)
要么
// In its subclass
override val num : Int get() = 0
Run Code Online (Sandbox Code Playgroud)
除了这两个之外,我还可以用Java方式做到这一点:
// In a superclass or an interface
abstract fun getNum() : Int
// In its subclass
override fun getNum() : Int = 0
Run Code Online (Sandbox Code Playgroud)
就内存和生成的字节码而言,这三个之间有何区别?哪一个是最好的?
在Kotlin中是否有更好的方法或模式来声明将被覆盖为常量的属性?
功能上有所不同。
使用分配在创建对象时初始化字段:
override val num : Int = 0
Run Code Online (Sandbox Code Playgroud)
这将创建一个具有value的隐式最终支持字段0,并且getter始终返回相同的值。这是生成的字节码反编译为Java:
private final int num;
public int getNum() {
return this.num;
}
Run Code Online (Sandbox Code Playgroud)
第二个声明实际上是getter覆盖,这也是从接口实现属性的有效方法。这不会创建备用字段,因此您的属性可以在每次调用(例如方法调用)时返回不同的值:
override val num : Int get() = 0
Run Code Online (Sandbox Code Playgroud)
反编译的字节码:
public int getNum() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |