2016-11-29 68 views
8

W interfejsie Kotlin ma znaczenie, czy właściwości są zadeklarowane za pomocą pustych instrukcji get/set?Podczas tworzenia interfejsu w Kotlin, czy ma znaczenie, czy właściwości zostały zebrane/ustawione?

Na przykład ...

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

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

Mam twardy czas zauważamy różnicę.

Podczas implementowania interfejsu nie wydaje się, aby użyć właściwości getter/setters dla właściwości lub jeśli ustawię wartość bezpośrednio.

Podczas uzyskiwania dostępu do tych za pośrednictwem java, val oba mają pobiera pobiera, a var zarówno mają pobierające i ustawiające.

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

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

    e.getC(); 

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

Proszę rozważyć [akceptując odpowiedź] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), jeśli w pełni pokrywa twoje pytanie lub rozwiązuje problem, a jeśli ci pomógł.To pozwoli innym zobaczyć, że akceptujesz rozwiązanie lub wyjaśnienie, a pytanie nie będzie już w stanie bez odpowiedzi. – hotkey

Odpowiedz

10

Deklaracje nieruchomości w swoim przykładzie są identyczne, get i set można bezpiecznie usunąć stamtąd, ponieważ, jak pan słusznie zauważył, akcesory są generowane tak. Składnia z get i set może jednak zostać wykorzystana do zapewnienia implementacji akcesorium lub ograniczenia jego widoczności.

  • Zapewnienie wdrożenia:

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

    Ten przykład pokazuje implementację domyślną właściwości zadeklarowane w interfejsie. Ta właściwość może nadal być przesłonięta wewnątrz implementacji interfejsu.

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

    Tutaj get() = ... zastępuje domyślne zachowanie pochłaniacza nieruchomości z polem podkładu, natomiast set nie wspomina, dlatego zachowuje się normalnie.

  • Widoczność ograniczenie:

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

    W tym przykładzie, widoczność seter jest private. Widoczność get jest zawsze taka sama jak widoczność nieruchomości, więc nie ma potrzeby jej określania osobno. Interfejsy nie mogą zadeklarować członków private.

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

    Ustawiciel tej właściwości jest ograniczony do tej klasy i jej podklas. Interfejsy nie mogą zadeklarować członków protected.

Oczywiście, implementacja dostępowe mogą być połączone z ograniczeniem widoczności:

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

Patrz także: