2016-11-29 24 views
8

在Kotlin接口中,使用空的get/set語句聲明屬性是否重要?當在Kotlin中創建一個接口時,如果屬性已經設置了,那麼它是否重要?

例如...

interface ExampleInterface { 
    // These... 
    val a: String 
     get 
    var b: String 
     get 
     set 

    // ...compared to these... 
    val c: String 
    var d: String 
} 

我有一個很難注意到的差異。

在實現接口時,如果我使用屬性的getters/setter或者直接設置值,似乎並不重要。

當通過java訪問這些文件時,val都有getter,var都有getter和setter。

public void javaMethod(ExampleInterface e) { 
    e.getA(); 

    e.getB(); 
    e.setB(); 

    e.getC(); 

    e.getD(); 
    e.setD(); 
} 
+0

請考慮[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)如果它完全覆蓋你的問題或解決問題,並且它對你有幫助。這將讓其他人看到你批准瞭解決方案或解釋,並且問題不再處於未答覆狀態。 – hotkey

回答

10

在你的榜樣財產申報是相同的,getset可以從那裏被安全地移除,因爲,當你正確地指出,無論如何都會產生的存取。但是,getset的語法可用於提供訪問器實現或限制其可見性。

  • 提供了實現:

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

    這個例子顯示了在接口中聲明的屬性的默認實現。該屬性仍然可以在接口實現中被覆蓋。

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

    這裏,get() = ...覆蓋與背襯字段屬性的默認吸氣行爲,而沒有提及set,從而它可以正常工作。

  • 能見度限制:

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

    在本例中,裝定件能見度privateget的可見性總是與該屬性的可見性相同,因此不需要單獨指定它。接口無法聲明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 } 
} 

參見:

相關問題