2010-01-07 6 views
8

J'ai cette question plutôt simple à propos de Scala. Étant donné que je dois à la définition de classe suivante:Comment exposer une variable constructeur (sic!) En lecture seule?

class Foo(var bar: Int) 

Le code qui est capable de construire une instance de Foo doit être en mesure de transmettre la valeur initiale bar. Mais si je définis bar comme var l'utilisateur est également capable de changer sa valeur à l'exécution ce qui n'est pas ce que je veux. L'utilisateur ne doit pouvoir lire que bar. bar lui-même est modifié en interne donc un val n'est pas une option.

Répondre

13

Lecture seule pour une propriété est facile, il suffit de créer une méthode getter sans le setter correspondant. Il est également facile de créer un champ modifiable privé.

Votre plus grand défi ici est l'espace de noms partagé, vous voulez être en mesure d'utiliser le même nom pour:

  • le constructeur param
  • le champ modifiable interne
  • getter publique
  • le setter privé

Malheureusement, ce n'est pas possible, et vous avez besoin d'un nom distinct pour chaque rôle ... mething comme ceci:

class Bippy(bop0: Int) { 
    private[this] var privatebop = bop0 
    //privatebop is ONLY EVER used by the following getter and setter: 
    private def bop_=(x:Int) = privatebop = x 
    def bar = privatebop 
} 

Si vous n'êtes pas préoccupé par l'utilisation des arguments nommés, ou avec le nom de l'argument Scaladoc, alors cela peut être raccourcies encore plus loin:

class Bippy(private[this] var privatebop) { 
    //privatebop is ONLY EVER used by the following getter and setter: 
    private def bop_=(x:Int) = privatebop = x 
    def bop = privatebop 
} 

MISE À JOUR

La méthode la plus propre, sans doute, ce qui vous donne des paramètres de retour nommés est de combiner une usine avec l'une des techniques ci-dessus:

object Bippy{ 
    def apply(bop: Int) = new Bippy(bop) 
} 

Qui peut ensuite être appelé Bippy(42). Juste le même que le constructeur régulier, mais sans le mot-clé new.

+0

Bonne réponse, merci beaucoup! – Malax

Questions connexes