Основных проблемы две. Во-первых, это непонятный статус объекта в момент работы конструктора. Объект как бы есть, но он еще не является полноценным. Становится сложным или небезопасным, например, использование этого недоинициализированного объекта снаружи. Во-вторых, требуется аккуратность при обработке исключений в конструкторе, которые приведут к прерыванию процесса создания объекта.
Поэтому такой мой концепт. Даже не концепт, а экспериментальном вариант, который уже используется в некотором языке программирования. В принципе, такой подход можно взять на вооружение и в обычных языках (что я и делаю).
Конструктором является метод. Можно считать его специальным, но по сути это обычный метод. Но сам метод не выполняется в контексте нового объекта. Более того, в момент подготовки данных в методе объекта ещё нет.
Уже после инициализации данных в методе создается новый объект. Но в объекте нет полей, которые требуют инициализации. А состояние объекта хранится через замыкания (closure) локальных переменных этого метода.
Вместо тысячи слов пример (на некотором условном языке c немного условным синтаксисом):
def Counter(startValue: Int) = {
var value = startValue
new {
def next(): Int = {
val ret = value
value = value + 1
ret
}
def reset(): () = {
value = startValue
}
}
}
В данном примере переменная value фактически является скрытым полем, которое представляет состояние объекта.
0 comments:
Post a Comment