Можно ли сделать "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