Могу ли я сделать "public val", но "private var" в Scala в одну строку? - PullRequest
10 голосов
/ 14 февраля 2011

т.е. Можно ли создать переменную, которую нельзя назначить извне класса?

Ответы [ 3 ]

14 голосов
/ 14 февраля 2011

Сейчас нет, нет способа сделать это.

Вы ограничены следующим трехстрочным решением:

class Hider {
  private[this] var xHidden: Int = 0
  def x = xHidden
  private def x_=(x0: Int) { xHidden = x0 }
}

Теперь сам класс является единственнымкто может манипулировать базовым полем xHidden, в то время как другие экземпляры класса могут использовать метод setter, и каждый может увидеть метод getter.

Если вы не возражаете против использования других имен, вы можете просто сделатьvar private и забудьте установщик (две строки).

Нет ключевого слова "var to me, val to them".

4 голосов
/ 14 февраля 2011

Вы можете сделать что-то вроде:

class Test {
   private var myprivatevar = ""

   def publicvar = myprivatevar
}

Из других классов вы сможете использовать только publicvar, и, поскольку нет метода publicvar_=, вы не можете назначить его извне.

0 голосов
/ 14 февраля 2011

Вы, конечно, создаете что-то как переменную, а затем делаете это частным для класса, определяющего поле.

scala> class Holder(private var someValue: String) {       
     | def getValueOfOther(other: Holder) = other.someValue
     | def combinedWith(holder: Holder) = new Holder(holder1.someValue + " " + holder2.someValue)
     | def value = someValue
     | }
defined class Holder

scala> val holder1 = new Holder("foo")                                                   
holder1: Holder = Holder@1303368e

scala> val holder2 = new Holder("bar")                                                   
holder2: Holder = Holder@1453ecec

scala> holder2.getValueOfOther(holder1)                                                  
res5: String = foo

scala> val holder3 = holder1 combinedWith holder2
holder3: Holder = Holder@3e2f1b1a

scala> holder3.value
res6: String = foo bar
...