Можно ли сделать "public val", но "private var" в Scala в одну строку?

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

3 ответа

Решение

Прямо сейчас нет, нет способа сделать это.

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

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

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

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

Там нет ключевого слова "var для меня, val для них".

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

class Test {
   private var myprivatevar = ""

   def publicvar = myprivatevar
}

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

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

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
Другие вопросы по тегам