在Kotlin中将属性重写为常量的最佳方法

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中是否有更好的方法或模式来声明将被覆盖为常量的属性?

Paw*_*wel 5

功能上有所不同。

使用分配在创建对象时初始化字段:

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)