В последнее время, когда я спрашиваю , как сделать методы поточно-ориентированными в одноэлементном шаблоне , кто-то сказал мне, что использование одноэлементного шаблона enum-версии является хорошим вариантом.и несколькими потоками.Если метод имеет побочные эффекты (изменяет состояние некоторой переменной), тогда вам нужно подумать о том, чтобы защитить его (сделать его синхронизированным) или его части.Поэтому я пишу такой код:
public enum ReStation {
INSTANCE;
private List<Email> emailList;
private ReStation() {
emailList = new ArrayList<>();
}
public synchronized void recycleEmail(Email email) {
System.out.println("Recycle station recycleing the email: "
+ email.getContent());
emailList.add(email);
}
public synchronized void deleteEmail(Email email) {
emailList.remove(email);
}
public synchronized void clear() {
emailList.clear();
}
}
, однако, когда я читаю книгу под названием «Элементы шаблона проектирования многоразового объектно-ориентированного программного обеспечения», я сталкиваюсь с таким абзацем, как показано ниже:
Применимость
Используйте шаблон Singleton, когда
• должен быть ровно один экземпляр класса, и он должен быть доступен клиентам из известной точки доступа.
• когда единственный экземпляр должен быть расширяемым путем создания подклассов, и клиенты должны иметь возможность использовать расширенный экземпляр без изменения своего кода.
Учитывая, что перечисление не может быть расширено, я действительно озадачен тем, как можно использовать расширенный экземпляр без изменения их кода при использовании одноэлементного шаблона версии перечисления?Является ли изменение кодов синглтон-класса единственным способом расширения функциональности синглтона?