Известен
подход thread-safe к определению паттерна Singleton
public class Singleton {
// Private constructor prevents instantiation from other classes
private Singleton() { }
/**
* SingletonHolder is loaded on the first execution of Singleton.getInstance()
* or the first access to SingletonHolder.INSTANCE, not before.
*/
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
Этот участок кода переодически возникает как boiler-plate, который бы хотелось переиспользовать. Т.е., если бы можно было сделать некий SingletonNature, такой чтобы можно было декларировать:
public Singleton extends SingletonNature<Singleton>
{
}
Возможно ли это? Если да, приведите, пожайлуйста, работающий код.
Здравствуйте, RolandD, Вы писали:
RD>Известен подход thread-safe к определению паттерна Singleton
С тех пор как volatile подправили, то можно и через double-check делать.
RD>Этот участок кода переодически возникает как boiler-plate, который бы хотелось переиспользовать. Т.е., если бы можно было сделать некий SingletonNature, такой чтобы можно было декларировать:
RD>Возможно ли это? Если да, приведите, пожайлуйста, работающий код.
Имхо, никак. Вся фишка в том что ленивость такого синглтона достигается вложеным классом, который, соответственно, должен быть своим у каждого синглтона. Поэтому переиспользовать тут нечего. Ну, и вообще, какие нафиг синглтоны в эпоху Dependency Injection?
Здравствуйте, RolandD, Вы писали:
RD>Этот участок кода переодически возникает как boiler-plate, который бы хотелось переиспользовать. Т.е., если бы можно было сделать некий SingletonNature, такой чтобы можно было декларировать:
RD>RD>public Singleton extends SingletonNature<Singleton>
RD>{
RD>}
RD>
RD>Возможно ли это? Если да, приведите, пожайлуйста, работающий код.
Боюсь никак, так как типы разрешаются во время компиляции, а значит написать public static final T instance = new T(); не получится.
А вам точно надо создавать синглтоны руками? Никакой IoC контейнер или просто фабрику бинов не используете?
Здравствуйте, Blazkowicz, Вы писали:
RD>>Известен подход thread-safe к определению паттерна Singleton
B>С тех пор как volatile подправили, то можно и через double-check делать.
Только после исправления volatile профита от такой оптимизации почти не стало. Почти то же самое, что и просто объявить метод синхронизированным.
Здравствуйте, RolandD, Вы писали:
RD>Известен подход thread-safe к определению паттерна Singleton
1. Сейчас не модно называть синглтон паттерном проектирования, в Java и .NET оно канонично рассматривается как стратегия разрешения зависимости, при которой для одного интерфейса есть не _одна реализация_, а _один объект_. Т.е. правильно было бы просто перейти на какой-нибудь Spring или, как минимум, Guice, если не хочется хардкора.
2. Если вам нужно много синглтонов, настолько много, что пугает боилерплейт, у вас что-то не то с дизайном.
RD>Возможно ли это? Если да, приведите, пожайлуйста, работающий код.
Именно в том виде, как вы сформулировали, такого можно добиться через применение AspectJ. Можно даже extends заменить на implements, или даже просто пометить нужные классы аннотацией. На pure Java, наверное, не получится, потому что даже вот такое простое:
class Singleton<T> {
private static T instance = ....;
}
работать не будет — шаблонные параметры не доступны для статических полей и статических методов.