2015-05-20 3 views
2

В соответствии с этим: A Strategy for Defining Immutable ObjectsКонечные поля и неизменяемые классы

Одним из условий для класса неизменяемые, делают все его поле является окончательным и частным.

Почему окончательный ??? Другие условия недостаточны?

+0

Читайте внимательно: _Не все классы, задокументированные как «неизменные», следуют этим правилам. –

+2

'final' имеет последствия для безопасности потоков - см. Это сообщение в блоге: http://jeremymanson.blogspot.co.nz/2008/04 /immutability-in-java.html – Blorgbeard

+0

Может ли 'Class.getDeclaredField(). set ...' использоваться для изменения значения конечного поля? Я знаю, что он может использоваться для изменения значения частного поля. –

ответ

0

Без создания поля final мы можем создать неизменяемый класс/объект, если доступны другие условия.

Но я думаю, что final полезен при работе с параллелизмом и синхронизацией.

0

Ключ к связанному документу эта цитата

Не все классы документированы как «неизменное» следовать этим правилам .... Однако такие стратегии требуют сложного анализа и не для начинающих.

Это учебное пособие для начинающих. Легче сказать им «сделать все приватным и окончательным», а затем объяснить все крайние случаи тем, как правильно обрабатывать изменчивые ссылки и не позволять вашим ссылкам бежать.

1

По определению для неизменяемого объекта (любезно предоставлено Википедии) «В объектно-ориентированном и функциональном программировании неизменяемым объектом является объект, состояние которого не может быть изменено после его создания».

Как только окончательный объект был создан, он не может быть переназначен. Без заключительной ключевой работы вы все равно можете изменить объект после его создания.

Смотрите также final object in java

+0

Если класс является окончательным, а его поля являются частными и не определены определители, и мы не передаем ссылки на изменяемые объекты (например, с помощью геттеров), класс является неизменным ... эти условия достаточны (нет необходимости в поля будут окончательными). –

+0

Почему бы не позволить компилятору проверить это для вас? – keuleJ

+0

Кажется, что у меня с трудом появляется клавиша ввода Существуют разные уровни неизменяемости, которые могут или не могут использоваться в финале, я даже не буду притворяться, как я их понимаю. Примером того, почему другие условия сами по себе недостаточны «в некоторых случаях» из документации Oracles: « », окончательные поля также позволяют программистам реализовать поточно-безопасные неизменяемые объекты без синхронизации ». http://docs.oracle.com /javase/specs/jls/se7/html/jls-17.html#jls-17.5-110 Для, вероятно, гораздо лучшего ответа, тогда мой собственный ответ от assylias в http://stackoverflow.com/questions/16061030/ –

1

Встречный вопрос: "Почему не окончательна?".

final средство для примитивных типов вы не сможете изменить значение после своего назначения, которое достаточно, чтобы сделать их Immmutable,

в то время как для не-примитивных типов ссылка не может быть изменена (первый шаг на пути к Неизменяемость) после назначения, и вам нужно сделать еще несколько, как указано в общей вами ссылке.

+0

, но других условий достаточно. –

+0

Поскольку вы пишете неизменяемый класс, и вы уверены, что после того, как он назначил его никогда не изменяться, используйте преимущества потенциальной оптимизации времени выполнения и времени компиляции –