powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Паттерн immutable
17 сообщений из 17, страница 1 из 1
Паттерн immutable
    #39369617
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

Уважаемые формучане. Расскажите пожалуйста на пальцах про паттерн immutable.

В интернете везде говорится не про паттерн как таковой, а что нужно сделать, чтобы класс был immutable.
т.е. везде лепить final. Сделать класс final, и его внутренние поля и методы также final.

Если это и есть паттерн immutable то скажите что это так и есть. Или я чего то не так понимаю?

Спасибо.
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369621
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERПриветствую!

Уважаемые формучане. Расскажите пожалуйста на пальцах про паттерн immutable.

В интернете везде говорится не про паттерн как таковой, а что нужно сделать, чтобы класс был immutable.
т.е. везде лепить final. Сделать класс final, и его внутренние поля и методы также final.

Если это и есть паттерн immutable то скажите что это так и есть. Или я чего то не так понимаю?

Спасибо.

immutable - это когда состояние объекта невозможно изменить. Final позволяет запретить переопределение класса т.е без этого в принципе вы можете сделать immutable определение класса и объявить об этом в документации, но ктото переопределить и попортит переопределенный класс сделал его Mutable. Ктото в коде сделает приведение и будет пользовать объектом как immutable хотя он mutable. Final гарантирует что этого не произойдет.

Необязательно делать внутренние поля и методы final, достаточно сделать так чтобы невозможно было получить ссылку на изменяемые объекты внутри immutable object, например возвращать копию данных.
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369626
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,

Мне бы простецкий пример. Был бы Вам благодарен.
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369635
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERlleming,

Мне бы простецкий пример. Был бы Вам благодарен.
Тебе он мало что даст. Рискну предположить что ты еще мало работал
с мультипоточностью и не решал проблемы расхода heap. И поэтому
само по себе знание того как написать immutable мало чего тебе даст.
Не сможешь агрументировать зачем переписал обычный класс на иммутабельный.

Кроме того надо понимать что некоторые вещи в Java (поведение строковых
констант) невозможно запрограммировать отдельно. Это часть language-specs
и она дана нам свыше как данное. Мы это используем но изменить поведение
не можем.

Но в качестве "кошки" для тривиальных случаев - вот тебе пример иммутабельного вектора.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Immutable
public final class Vector {

    public final double x, y, z;

    public Vector(double x, double y, double z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
    .....

}
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369642
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТебе он мало что даст.
+1
Аффтар! Про пул тебе рассказали. А это ещё хуже того пула)) LOL.
Не заморачивайся.
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369646
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Ну конечно! Вы тут как тут! Кто бы сомневался)))
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369648
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

И что тут иммутабельного? Помоему как раз в конструктор передаются x, y, z и меняются внутренние поля объекта?!
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369650
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERmayton,

И что тут иммутабельного? Помоему как раз в конструктор передаются x, y, z и меняются внутренние поля объекта?!
Попробуй их поменять еще раз.
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369652
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Я читал, что для иммутабельного класса "прячут" или вовсе не делают сеттеров, а геттеры не возвращают ссылку на внутреннее поле объекта а делают new <..>, или возвращают копию экземпляра. Если не так - поправьте.
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369659
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERmayton,

Я читал, что для иммутабельного класса "прячут" или вовсе не делают сеттеров, а геттеры не возвращают ссылку на внутреннее поле объекта а делают new <..>, или возвращают копию экземпляра. Если не так - поправьте.

llemingНеобязательно делать внутренние поля и методы final, достаточно сделать так чтобы невозможно было получить ссылку на изменяемые
объекты внутри immutable object, например возвращать копию данных.


точнее возвращать ссылку на объект копию
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369668
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,

Причин делать immutable объект может быть много, но как я понял, основная причина - это использование в многопоточной среде. Когда нужны гарантии, что при доступе от разных потоков значение объекта было гарантированно одним и тем же?
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369672
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще да. основная среда это многопоточные приложения.

плюс компилятор еще может делать всякие оптимизации. еще упрощается отладка, изменяемые объекты приводят к труднообнаруживаемым ошибкам.
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369737
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Так что? Не удалось поменять второй раз поля x,y,z ?

MAULERmayton,

Я читал, что для иммутабельного класса "прячут" или вовсе не делают сеттеров, а геттеры не возвращают ссылку на внутреннее поле объекта а делают new <..>, или возвращают копию экземпляра. Если не так - поправьте.

2) Можно и так. Только getters/setters это не уровень Java. Это более высокий уровень EJB/SpringBeans.

Еще подумай, можно-ли реализовать иммутабельность для класса с полями Random, File, java.sql.Connection ?
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369827
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERmayton,

И что тут иммутабельного? Помоему как раз в конструктор передаются x, y, z и меняются внутренние поля объекта?!
А объект уже можно создать без конструктора?
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369829
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingMAULERmayton,

Я читал, что для иммутабельного класса "прячут" или вовсе не делают сеттеров, а геттеры не возвращают ссылку на внутреннее поле объекта а делают new <..>, или возвращают копию экземпляра. Если не так - поправьте.

llemingНеобязательно делать внутренние поля и методы final, достаточно сделать так чтобы невозможно было получить ссылку на изменяемые
объекты внутри immutable object, например возвращать копию данных.


точнее возвращать ссылку на объект копию

Какую-то ерунду понаписали. Смысл immutable объектов в том, что вместо изменения состояние мы создаём новый объект на основе старого, а не какие-то непонятные копии.

MAULER,
Посмотрите на java.lang.String и Java 8 Date/Time API. Эти классы и реализуют ваш "паттерн"
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369843
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAULERlleming,
Причин делать immutable объект может быть много, но как я понял, основная причина - это использование в многопоточной среде. Когда нужны гарантии, что при доступе от разных потоков значение объекта было гарантированно одним и тем же?Да что там многопоточность. Таблицы, вокруг которых построена половина кода в java. Использование mutable объектов в качестве ключа в таблице считается очень плохим тоном.
...
Рейтинг: 0 / 0
Паттерн immutable
    #39369868
y.dev.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я скорее по дотнету, но. Семантика final-полей определена в JLS отдельно, и непосредственно относится к многопоточности (JLS 17.5, final Field Semantics). final-поля, по спецификации, могут кэшироваться в регистры и не перегружаться там, там где обычные не-final поля будут перегружены. Кроме того, явно указано, что immutable-объекты могут быть использованы как потокобезопасные без синхронизации. Более того, определено, что не может быть race condition-а при создании immutable-объектов - в тот момент, когда поток видит созданный объект, он уже правильно создан, до отработки конструктора поток не видит ссылку на этот новый объект.

Т.е. этот "паттерн" определен напрямую как набор свойств объекта, делающего его immutable и описывающего бенефиты от этого - причем, в спецификации.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Паттерн immutable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]