Properties 在Kotlin中创建接口时,属性是否具有get/set是否重要?
在Kotlin接口中,如果使用空get/set语句声明属性,这有关系吗 例如Properties 在Kotlin中创建接口时,属性是否具有get/set是否重要?,properties,kotlin,getter-setter,Properties,Kotlin,Getter Setter,在Kotlin接口中,如果使用空get/set语句声明属性,这有关系吗 例如 interface ExampleInterface { // These... val a: String get var b: String get set // ...compared to these... val c: String var d: String } 我很难发现有什么不同 在实现接口时,对于属性使
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" }
用一个支持字段覆盖属性的默认getter行为,而没有提到get()=…
,因此它的行为正常set
- 能见度限制:
class Example { var s: String = "s" private set }
在本例中,setter可见性为class Example { var s: String = "abc" private set(value) { if (value.isNotEmpty()) field = value } }
。private
的可见性始终与属性的可见性相同,因此无需单独指定。接口不能声明get
成员private
此属性的setter仅限于此类及其子类。接口不能声明受保护的成员abstract class Example { abstract var b: String protected set // Restrict visibility }
abstract class Example {
abstract var b: String
protected set // Restrict visibility
}
当然,访问器实现可以与可见性限制结合使用:
class Example {
var s: String = "s"
private set
}
class Example {
var s: String = "abc"
private set(value) { if (value.isNotEmpty()) field = value }
}
另见:
-
请考虑它是否完全覆盖了你的问题或者解决了问题,如果它帮助了你。这将让其他人看到你批准了解决方案或解释,问题将不再处于未回答状态。