..are автоматически поточно-и имеют синхронизация не выдает
проблемы Параллелизм случиться, когда две различные нити изменять состояние одного и того же объекта. Неизменяемые объекты не могут быть изменены, поэтому проблем нет.
Пример: A String
. Два потока могут быть переданы одинаково String
без проблем, так как ни один из них не может мутировать его никак.
не нужен конструктор копирования
... потому что копия это единственный способ мутировать его. Один общий шаблон проектирования для неизменяемых объектов для каждой операции «модификации», чтобы сделать копию, а затем выполнить операцию над новым объектом.
Конструкторы копирования обычно используются на объектах, которые вы хотите изменить, не затрагивая оригинал. Это всегда так (по определению) с неизменяемыми объектами.
В случае String
все методы и оператор +
возвращают новый String
s.
не нужна реализация клона
см выше.
не должны быть скопированы, защищаясь при использовании в качестве поля
Однажды я сделал что-то глупое. У меня был набор перечислений в списке:
private static final List<Status> validStatuses;
static {
validStatuses = new ArrayList<Status>();
validStates.add(Status.OPEN);
validStates.add(Status.REOPENED);
validStates.add(Status.CLOSED);
}
Этот список был возвращен из метода:
public static List<Status> getAllStatuses() {
return validStates;
}
Я извлеченной этот список, но только хотел показать открытые состояния в интерфейсе:
List<Status> statuses = Status.getAllStatuses();
statuses.remove(Status.CLOSED);
Отлично, это сработало! Подождите, теперь все статусные списки показывают только те два - даже после обновления страницы! Что случилось? Я изменил статический объект. К сожалению.
Я мог бы использовать защитное копирование по возвращенному объекту getAllStatuses
. Или, я мог бы использовать что-то вроде Guava's ImmutableList в первую очередь:
private static final List<Status> validStatuses =
ImmutableList.of(Status.OPEN, Status.REOPENED, Status.CLOSED);
Тогда, когда я сделал что-то тупое:
List<Status> statuses = Status.getAllStatuses();
statuses.remove(Status.CLOSED); // Exception!
всегда есть «отказ атомарность» (термин, используемый Джошуа Блох): если неизменяемый объект выдает исключение, он никогда не остается в нежелательном или неопределенном состоянии.
Поскольку класс не может быть изменен, все состояния, испускаемые модификациями являются целыми, квалифицированными объектами (потому что они не могут изменить, они всегда должны быть в квалифицированном состоянии, чтобы быть полезными). Исключение не будет генерировать новый объект, и поэтому вы никогда не сможете иметь нежелательное или неопределенное состояние.
Я проголосовал за закрытие. Это пять вопросов, объединенных в один, каждый из которых потребует широких подробных ответов. Не знаю, почему у этого есть три голоса. –
Это какая-то домашняя работа? Также обратите внимание, что сразу возникает много вопросов, а также некоторые вопросы основаны на мнениях.Пожалуйста, сделайте свой вопрос более конкретным и покажите нам, что вы пробовали. –
Это пахнет немного, как домашнее задание - вы можете задавать вопросы, которые суть, а не общий. Пойдите и попытайтесь решить эти вопросы самостоятельно - если вы застряли, мы можем помочь – Mirco