Страницы

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

воскресенье, 22 декабря 2019 г.

Immutable объект в Java

#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.

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

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