Идея, если кратко, в том, что тупо научить язык де...
# russian
e
Идея, если кратко, в том, что тупо научить язык делать то же самое, что в stdlib ручками сделано для коллекций. Ведь преобразование
MutableList
->
List
это весьма механическая опреация (надо просто вырезать мутирующие методы), поэтому можно переименовать
MutableList
в
mutable List
, где приставка
mutable
как раз и делает это вырезание. Ну и чтобы можно это было к любым классам интерфейсам применять до кучи. Ну это идея в целом. Там много всяких подводных граблей вылезает, которые надо аккуратно обойти
1
i
От того, что на MutableList смотрят как на read-only, он immutable не становится.
e
Это проблему тоже надо решать. Здесь, опять же, может помочь компилятор. Например, если ты пишешь
immutable class Data(mut x: Int, mut y: Int)
то за сценой компилятор может сделать x & y mutable (не final), но добавить
final Boolean readonly
поле, а на всех setter-а сгенерировать проверки на
readonly
. Тогда один и тот же класс-файл сможет работь и как 100% immutable object c гарантированной runtime проверкой что его нельзя поменять, так и свой же собственный билдер, чтобы удобно было менять поле-за-полем. Остается какая-то мелочь — аккуратно всё это встроить в систему типу и в синтаксис 🧌
i
Ага, это Freezable-подход
e
Да. Это как они в JDK хотят с arrays. Я много думал и убедил себя в том, что, по большому счету, другого грамотного способа реализовать это всё на JVM просто нет. А вот как именно это встроить в язык и его синтаксис, то тут очень большой простор для дизайнерского творчества
Возьми те же `val`/`var` внтури
immutable class
. Как их назвать? Вот я в примере вышел сказал
mut
. Потому что это и не совсем
val
и не совсем
var
а черт-знает что. На самом деле, это, конечно
mut var
, а если еще точнее, то это свойство у которого есть обычный getter и
mut fun
setter…. Ну а дальше в эти дебри если лезть то становится еще веселей. Там и “abstraction over mutablity” вылаезат и весь вагон других проблем, на который 100500 научных работ написано.