2010-01-07 3 views
8

У меня есть довольно простой вопрос о Scala. Учитывая, что я должен следующее определение класса:Как выставить переменную конструктора (sic!) Как доступную только для чтения?

class Foo(var bar: Int) 

код, который способен построить экземпляр Foo должен быть в состоянии пройти начальное значение для bar. Но если я определяю bar как var, Пользователь также может изменить свое значение во время выполнения, что не то, что я хочу. Пользователь должен иметь возможность читать только bar. bar сам модифицирован внутри, поэтому val не является вариантом.

ответ

13

Простота чтения только для свойства, просто создайте метод геттера без соответствующего устройства. Также легко сделать частное модифицируемое поле.

Ваша самая большая проблема здесь является общим пространством имен, вы хотите, чтобы иметь возможность использовать такое же имя для:

  • конструктора пары
  • внутреннего изменяемого поле
  • государственного добытчик
  • частный сеттер

К сожалению, это невозможно, и для каждой роли требуется отдельное имя ... поэтому mething так:

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 
} 

Если вы не обеспокоены использованием именованных аргументов или с именем аргумента в Scaladoc, то это может быть сокращен еще дальше:

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 
} 

UPDATE

чистейший метод, возможно, что дает вам обратно именованные параметры, чтобы объединить завод с одним из вышеуказанных способов:

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

Который может быть назван Bippy(42). Точно так же, как и обычный конструктор, но без ключевого слова new.

+0

Хороший ответ, большое вам спасибо! – Malax

Смежные вопросы