|
|
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
Приветствую! Уважаемые формучане. Расскажите пожалуйста на пальцах про паттерн immutable. В интернете везде говорится не про паттерн как таковой, а что нужно сделать, чтобы класс был immutable. т.е. везде лепить final. Сделать класс final, и его внутренние поля и методы также final. Если это и есть паттерн immutable то скажите что это так и есть. Или я чего то не так понимаю? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 17:57 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
MAULERПриветствую! Уважаемые формучане. Расскажите пожалуйста на пальцах про паттерн immutable. В интернете везде говорится не про паттерн как таковой, а что нужно сделать, чтобы класс был immutable. т.е. везде лепить final. Сделать класс final, и его внутренние поля и методы также final. Если это и есть паттерн immutable то скажите что это так и есть. Или я чего то не так понимаю? Спасибо. immutable - это когда состояние объекта невозможно изменить. Final позволяет запретить переопределение класса т.е без этого в принципе вы можете сделать immutable определение класса и объявить об этом в документации, но ктото переопределить и попортит переопределенный класс сделал его Mutable. Ктото в коде сделает приведение и будет пользовать объектом как immutable хотя он mutable. Final гарантирует что этого не произойдет. Необязательно делать внутренние поля и методы final, достаточно сделать так чтобы невозможно было получить ссылку на изменяемые объекты внутри immutable object, например возвращать копию данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 18:13 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
lleming, Мне бы простецкий пример. Был бы Вам благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 18:28 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
MAULERlleming, Мне бы простецкий пример. Был бы Вам благодарен. Тебе он мало что даст. Рискну предположить что ты еще мало работал с мультипоточностью и не решал проблемы расхода heap. И поэтому само по себе знание того как написать immutable мало чего тебе даст. Не сможешь агрументировать зачем переписал обычный класс на иммутабельный. Кроме того надо понимать что некоторые вещи в Java (поведение строковых констант) невозможно запрограммировать отдельно. Это часть language-specs и она дана нам свыше как данное. Мы это используем но изменить поведение не можем. Но в качестве "кошки" для тривиальных случаев - вот тебе пример иммутабельного вектора. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 18:53 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
maytonТебе он мало что даст. +1 Аффтар! Про пул тебе рассказали. А это ещё хуже того пула)) LOL. Не заморачивайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:06 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
Petro123, Ну конечно! Вы тут как тут! Кто бы сомневался))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:13 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
mayton, И что тут иммутабельного? Помоему как раз в конструктор передаются x, y, z и меняются внутренние поля объекта?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:17 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
MAULERmayton, И что тут иммутабельного? Помоему как раз в конструктор передаются x, y, z и меняются внутренние поля объекта?! Попробуй их поменять еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:28 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
mayton, Я читал, что для иммутабельного класса "прячут" или вовсе не делают сеттеров, а геттеры не возвращают ссылку на внутреннее поле объекта а делают new <..>, или возвращают копию экземпляра. Если не так - поправьте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:34 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
MAULERmayton, Я читал, что для иммутабельного класса "прячут" или вовсе не делают сеттеров, а геттеры не возвращают ссылку на внутреннее поле объекта а делают new <..>, или возвращают копию экземпляра. Если не так - поправьте. llemingНеобязательно делать внутренние поля и методы final, достаточно сделать так чтобы невозможно было получить ссылку на изменяемые объекты внутри immutable object, например возвращать копию данных. точнее возвращать ссылку на объект копию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:49 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
lleming, Причин делать immutable объект может быть много, но как я понял, основная причина - это использование в многопоточной среде. Когда нужны гарантии, что при доступе от разных потоков значение объекта было гарантированно одним и тем же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 20:12 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
вообще да. основная среда это многопоточные приложения. плюс компилятор еще может делать всякие оптимизации. еще упрощается отладка, изменяемые объекты приводят к труднообнаруживаемым ошибкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 20:29 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
1) Так что? Не удалось поменять второй раз поля x,y,z ? MAULERmayton, Я читал, что для иммутабельного класса "прячут" или вовсе не делают сеттеров, а геттеры не возвращают ссылку на внутреннее поле объекта а делают new <..>, или возвращают копию экземпляра. Если не так - поправьте. 2) Можно и так. Только getters/setters это не уровень Java. Это более высокий уровень EJB/SpringBeans. Еще подумай, можно-ли реализовать иммутабельность для класса с полями Random, File, java.sql.Connection ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 23:37 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
MAULERmayton, И что тут иммутабельного? Помоему как раз в конструктор передаются x, y, z и меняются внутренние поля объекта?! А объект уже можно создать без конструктора? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 09:48 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
llemingMAULERmayton, Я читал, что для иммутабельного класса "прячут" или вовсе не делают сеттеров, а геттеры не возвращают ссылку на внутреннее поле объекта а делают new <..>, или возвращают копию экземпляра. Если не так - поправьте. llemingНеобязательно делать внутренние поля и методы final, достаточно сделать так чтобы невозможно было получить ссылку на изменяемые объекты внутри immutable object, например возвращать копию данных. точнее возвращать ссылку на объект копию Какую-то ерунду понаписали. Смысл immutable объектов в том, что вместо изменения состояние мы создаём новый объект на основе старого, а не какие-то непонятные копии. MAULER, Посмотрите на java.lang.String и Java 8 Date/Time API. Эти классы и реализуют ваш "паттерн" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 09:51 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
MAULERlleming, Причин делать immutable объект может быть много, но как я понял, основная причина - это использование в многопоточной среде. Когда нужны гарантии, что при доступе от разных потоков значение объекта было гарантированно одним и тем же?Да что там многопоточность. Таблицы, вокруг которых построена половина кода в java. Использование mutable объектов в качестве ключа в таблице считается очень плохим тоном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 10:08 |
|
||
|
Паттерн immutable
|
|||
|---|---|---|---|
|
#18+
Я скорее по дотнету, но. Семантика final-полей определена в JLS отдельно, и непосредственно относится к многопоточности (JLS 17.5, final Field Semantics). final-поля, по спецификации, могут кэшироваться в регистры и не перегружаться там, там где обычные не-final поля будут перегружены. Кроме того, явно указано, что immutable-объекты могут быть использованы как потокобезопасные без синхронизации. Более того, определено, что не может быть race condition-а при создании immutable-объектов - в тот момент, когда поток видит созданный объект, он уже правильно создан, до отработки конструктора поток не видит ссылку на этот новый объект. Т.е. этот "паттерн" определен напрямую как набор свойств объекта, делающего его immutable и описывающего бенефиты от этого - причем, в спецификации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 10:49 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39369621&tid=2123365]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
99ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 459ms |

| 0 / 0 |
