Страницы

Поиск по вопросам

среда, 14 ноября 2018 г.

Immutable объект в 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, то объект данного класса можно считать неизменным ? Учитывает ли данный класс все подводные камни многопоточности ?


Ответ

Да, поля обязательно должны быть final
Я бы не поставил знак равенства между между Immutable объектом и объектом, имеющим методы только для чтения. Дело в том, что в качестве оптимизации, компилятор может запросто переставлять строки с инструкциями, это так называемый reordering. В результате может получиться так, что ваш объект будет доступен из других потоков, но его переменные могут не быть проинициализированы. В однопоточных приложениях это в принципе не страшно, но вот если вы работаете в многопоточной среде, то final защитит ваши переменные от таких перестановок.
Теперь по существу ваших вопросов:
Да, объекты вашего класса можно считать неизменяемым. В многопоточной среде обязательно. Если строка будет не final, то такой объект уже не Immutable.

Комментариев нет:

Отправить комментарий