Kotlin直接访问Java字段,而不是使用getter / setter

时间:2020-10-04 09:12:02

标签: java kotlin

例如,这是一个Java类

public class Thing {
    ...
    public int thing;
    public int getThing() { return thing; }
    public void setThing(int t) { thing = t; }
}

在Kotlin中,如果我想访问thing,请执行以下操作:

val t = Thing()
t.thing // get
t.thing = 42 //set

在反编译的Kotlin字节码中,我看到的是Kotlin使用getter和setter:

t.getThing()
t.setThing(42)

我想知道是否有一种方法可以直接访问字段t.thing而不是使用getter和setter吗?

2 个答案:

答案 0 :(得分:1)

我不确定您正在查看的字节码是否为您提供了完整的解释。

我修改了您的测试类,为基础字段赋予100getThing()不同的行为:

setThing()

然后在运行此Kotlin代码时:

public class Thing {
    public int thing;
    public int getThing() { return thing + 1; }
    public void setThing(int t) { thing = 0; }
}

我得到:

fun main() {
    val t = Thing()
    t.thing = 1
    println(t.thing)
    println(t.getThing())

    t.setThing(1)
    println(t.thing)
    println(t.getThing())
}

这表明1 2 0 1 实际上是直接获取和设置该字段。

答案 1 :(得分:0)

您可以直接从Kotlin代码访问Java字段。因此,如果没有吸气剂,您仍然可以访问t.thing

但是我认为当您有吸气剂时,不可能访问该字段。如果您无法编辑Java代码,但仍想直接访问该字段(以避免在getter或其他方面产生副作用),则可以使用另一个Java类来实现。这样,您可以管理对字段的访问。

public class AnotherThing {
    ...
    public Thing thing;
    public getField() { return thing.thing; }
}
相关问题