当在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(); }
在你的例子中的属性声明是相同的, get
和set
可以从那里安全地删除,因为正如你正确指出的那样,访问器是无论如何生成的。 然而,使用get
和set
的语法可以用来提供访问器实现或限制其可见性。
-
提供实施:
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的可见性是
private
。get
的可见性总是与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参考文章
- 属性可见性的解释在另一个答案