ОК, в вопросе о 'Переменные класса как константы' я получаю тот факт, что константы недоступны до тех пор, пока не будет запущен «официальный» конструктор (т.е. пока у вас не будет экземпляра) , НО, что если мне понадобится спутник-одиночка для звонков в класс:
object thing {
val someConst = 42
def apply(x: Int) = new thing(x)
}
class thing(x: Int) {
import thing.someConst
val field = x * someConst
override def toString = "val: " + field
}
Если я сначала создаю объект-компаньон, «новая вещь (x)» (в компаньоне) вызывает ошибку. Однако, если я сначала определю класс, «x * someConst» (в определении класса) вызовет ошибку.
Я также пытался поместить определение класса в синглтон.
object thing {
var someConst = 42
def apply(x: Int) = new thing(x)
class thing(x: Int) {
val field = x * someConst
override def toString = "val: " + field
}
}
Однако, делая это, я получаю объект типа 'thing.thing'
val t = thing(2)
Результаты в
t: thing.thing = val: 84
Единственное полезное решение, которое я нашел, - это создание абстрактного класса, компаньона и внутреннего класса (который расширяет абстрактный класс):
abstract class thing
object thing {
val someConst = 42
def apply(x: Int) = new privThing(x)
class privThing(x: Int) extends thing {
val field = x * someConst
override def toString = "val: " + field
}
}
val t1 = thing(2)
val tArr: Array[thing] = Array(t1)
Хорошо, у 't1' все еще есть тип 'thing.privThing', но теперь он может рассматриваться как 'вещь'.
Однако это все еще не элегантное решение, может кто-нибудь сказать мне лучший способ сделать это?
PS. Я должен отметить, что я использую Scala 2.8.1 на Windows 7