当在Kotlin中创建一个接口时,如果属性已经被设置了,那么它是否重要?

在Kotlin接口中,使用空的get / set语句声明属性是否重要?

例如…

interface ExampleInterface { // These... val a: String get var b: String get set // ...compared to these... val c: String var d: String } 

我很难注意到一个区别。

在实现接口的时候,如果我使用属性的getter / setter,或者直接设置值,这似乎并不重要。

当通过java访问这些数据时, val的getter和var都有getter和setter。

 public void javaMethod(ExampleInterface e) { e.getA(); e.getB(); e.setB(); e.getC(); e.getD(); e.setD(); } 

在你的例子中的属性声明是相同的, getset可以从那里安全地删除,因为正如你正确指出的那样,访问器是无论如何生成的。 然而,使用getset的语法可以用来提供访问器实现或限制其可见性。

  • 提供实施:

     interface ExampleInterface { var b: String get() = "" set(value) { } } 

    此示例显示在接口中声明的属性的默认实现。 该属性仍然可以在接口实现中被覆盖。

     class Example { var b: String = "" get() = "$field$field" } 

    这里, get() = ...覆盖了具有后台字段的属性的默认getter行为,而set没有被提及,因此它的行为正常。

  • 能见度限制:

     class Example { var s: String = "s" private set } 

    在这个例子中,setter的可见性是privateget的可见性总是与property的可见性相同,所以不需要单独指定它。 接口不能声明private成员。

     abstract class Example { abstract var b: String protected set // Restrict visibility } 

    这个属性的setter被限制在这个类和它的子类中。 接口不能声明protected成员。

当然,访问器实现可以与可见性限制结合使用:

 class Example { var s: String = "abc" private set(value) { if (value.isNotEmpty()) field = value } } 

也可以看看:

  • 关于属性的Kotlin参考文章
  • 属性可见性的解释在另一个答案