2016-11-29 1 views
8

Dans une interface Kotlin, est-ce important si les propriétés sont déclarées avec des instructions get/set vides?Lors de la création d'une interface dans Kotlin, est-ce important si les propriétés ont get/set?

Par exemple ...

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

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

Je suis un moment difficile de remarquer une différence.

Lors de la mise en œuvre de l'interface, il ne semble pas important si j'utilise des getters/setters pour les propriétés, ou si je définis directement la valeur. Lors de l'accès via java, les val ont tous deux des getters, et les var ont tous deux des getters et des setters.

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

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

    e.getC(); 

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

S'il vous plaît envisager [acceptant la réponse] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) si elle couvre entièrement votre question ou résout le problème et si cela vous a aidé.Cela permettra aux autres de voir que vous approuvez la solution ou l'explication, et la question ne sera plus dans l'état sans réponse. – hotkey

Répondre

10

Les déclarations de propriété dans votre exemple sont identiques, get et set peut être retiré en toute sécurité à partir de là, parce que, comme vous noté à juste titre, les accesseurs sont générés de toute façon. La syntaxe avec get et set peut, cependant, être utilisée pour fournir une implémentation d'accesseur ou pour restreindre sa visibilité.

  • Fournir la mise en œuvre:

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

    Cet exemple montre une implémentation par défaut d'une propriété déclarée dans une interface. Cette propriété peut toujours être redéfinie dans les implémentations d'interface.

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

    Ici, get() = ... remplace le comportement par défaut getter d'une propriété avec un champ de support, alors que set n'est pas mentionné, ainsi il se comporte normalement.

  • restriction de visibilité:

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

    Dans cet exemple, la visibilité setter est private. La visibilité de get est toujours la même que pour la visibilité de la propriété, il n'est donc pas nécessaire de la spécifier séparément. Les interfaces ne peuvent pas déclarer les membres private.

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

    Le paramètre de cette propriété est restreint à cette classe et à ses sous-classes. Les interfaces ne peuvent pas déclarer les membres protected.

Bien sûr, une mise en œuvre accesseur peut être combiné avec restriction de visibilité:

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

Voir aussi: