Immutable объект в Java

237
21 сентября 2017, 14:28

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

Answer 1

Да, поля обязательно должны быть final.

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

Теперь по существу ваших вопросов:

  1. Да, объекты вашего класса можно считать неизменяемым.
  2. В многопоточной среде обязательно.
  3. Если строка будет не final, то такой объект уже не Immutable.
READ ALSO
Java Bean Не инжектит бины

Java Bean Не инжектит бины

Здравствуйте! Второй день пытаюсь пофиксить проблемуВ проекте пытаюсь достать данные из базы, но вылетает NullPointerException

186
Java-Spring: Как выдавать JSON со связями?

Java-Spring: Как выдавать JSON со связями?

Всем доброго дня! Сервер написан на Java + Spring framework + PostgresqlМне нужно выдавать JSON такого вида:

171
Определение штата оффлайн

Определение штата оффлайн

Как определить штат по координатам, без запросов к google mapЖелательно оффлайн

130