Наверное, как и всякий программист, переходящий с C++ на Java, столкнулся с проблемой отсутствия плюсового аналога константных объектов. Конечно, понятно, что можно писать immutable интерфейсы, или дополнительную immutable версию нужного класса, или создавать копию объекта перед передачей его в функцию, или многое много другое. Но раз уж в Java нет для этого специальных средств - наверное, это было обдуманное решение. Так вот может кто-нибудь грамотно разъяснить следующие вопросы: 1) Почему же всё-таки такое решение было принято? 2) Как узнать может ли функция изменить состояние объекта? 3) Как написать функцию, чтобы люди, использующие её, не опасались изменения передаваемых объектов? 4) Аналогично для класса, чтобы у людей не возникало проблем с его использованием.
Ответ
Вот тут немного неясно. Как константный объект может вам гарантировать невозможность изменения внутреннего состояния объекта? Если вы вызываете метод, имеющий побочный эффект, то он просто изменит состояние объекта и всё.. и никакие внешние модификаторы вас не спасут. Если надо сделать так, чтобы какие-то свойства (или все) класса не могли быть изменены, то используйте final и тогда никакой код не сможет изменить ссылку или значение. Все внутренние свойства должны быть спрятаны. А методы не должны иметь ни малейшего намёка на возможность изменения состояния. Если это особенно важно, то можно в javadoc явно указать, что метод(ы) не имеет побочных эффектов и concurrent-safe. Про класс.. то можно просто дать ему правильное название. Например, ImmutableMap. Если метод называется getXXX, то это означает, что он не будет делать на самом деле set :)
Комментариев нет:
Отправить комментарий