В 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.
Комментариев нет:
Отправить комментарий