Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Паттерн immutable / 17 сообщений из 17, страница 1 из 1
18.12.2016, 17:57
    #39369617
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн immutable
Приветствую!

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

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

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

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

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

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

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

Спасибо.

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

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

Мне бы простецкий пример. Был бы Вам благодарен.
...
Рейтинг: 0 / 0
18.12.2016, 18:53
    #39369635
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн immutable
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
18.12.2016, 19:06
    #39369642
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн immutable
maytonТебе он мало что даст.
+1
Аффтар! Про пул тебе рассказали. А это ещё хуже того пула)) LOL.
Не заморачивайся.
...
Рейтинг: 0 / 0
18.12.2016, 19:13
    #39369646
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн immutable
Petro123,

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

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

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

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

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

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


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

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

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

MAULERmayton,

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

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

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

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

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

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


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

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

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

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


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