Properties 在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 } 我很难发现有什么不同 在实现接口时,对于属性使

在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
    }
    
    class Example {
        var s: String = "abc"
            private set(value) { if (value.isNotEmpty()) field = value }
    }
    
    在本例中,setter可见性为
    private
    get
    的可见性始终与属性的可见性相同,因此无需单独指定。接口不能声明
    private
    成员

    abstract class Example { 
        abstract var b: String
            protected set // Restrict visibility
    }
    
    此属性的setter仅限于此类及其子类。接口不能声明受保护的成员

  • 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 }
}
另见:

  • 请考虑它是否完全覆盖了你的问题或者解决了问题,如果它帮助了你。这将让其他人看到你批准了解决方案或解释,问题将不再处于未回答状态。