#java
В java все объект могут быть mutable и immutable. Понятно, что, например, строка является immutable. Но если я хочу создать собственный immutable тип, то какие требования он должен выполнять ? У меня есть такой пример: public class ImmutableObject { private final String string; private final Date date; public ImmutableObject(String string, Date date) { this.string = string; this.date = date; } public Date getDate() { return new Date(date.getTime()); } public String getString() { return string; } } Могу ли я его считать неизменяемым ? Обязательно ли поля должны быть final ? И если одно из полей, например строка, не будет final, то объект данного класса можно считать неизменным ? Учитывает ли данный класс все подводные камни многопоточности ?
Ответы
Ответ 1
Да, поля обязательно должны быть final. Я бы не поставил знак равенства между между Immutable объектом и объектом, имеющим методы только для чтения. Дело в том, что в качестве оптимизации, компилятор может запросто переставлять строки с инструкциями, это так называемый reordering. В результате может получиться так, что ваш объект будет доступен из других потоков, но его переменные могут не быть проинициализированы. В однопоточных приложениях это в принципе не страшно, но вот если вы работаете в многопоточной среде, то final защитит ваши переменные от таких перестановок. Теперь по существу ваших вопросов: Да, объекты вашего класса можно считать неизменяемым. В многопоточной среде обязательно. Если строка будет не final, то такой объект уже не Immutable.
Комментариев нет:
Отправить комментарий