Я использую перечислимый одноэлементный шаблон как это:
public enum LicenseLoader implements ClientLicense {
INSTANCE;
/**
* @return an instance of ClientLicense
*/
public static ClientLicense getInstance() {
return (ClientLicense)INSTANCE;
}
...rest of code
}
Теперь я хочу возвратить Интерфейс и скрыть то, что мы на самом деле используем перечисление вообще. Я хочу, чтобы клиент использовал getInstance () и не LicenseLoader. ЭКЗЕМПЛЯР, поскольку однажды я могу решить использовать другой шаблон при необходимости.
Возможно сделать ЭКЗЕМПЛЯР частным к перечислению?
А как насчет создания общедоступного интерфейса
и частного перечисления
, которое реализует
указанный интерфейс, с одноэлементным INSTANCE
константа?
Итак, что-то вроде этого (все в одном классе для краткости):
public class PrivateEnum {
public interface Worker {
void doSomething();
}
static private enum Elvis implements Worker {
INSTANCE;
@Override public void doSomething() {
System.out.println("Thank you! Thank you very much!");
}
}
public Worker getWorker() {
return Elvis.INSTANCE;
}
}
Таким образом, вы не раскрываете Elvis.INSTANCE
(или даже enum Elvis
), используя интерфейс
для определения вашей функциональности, скрывая все детали реализации.
Все enum
константы доступны. Например, через десериализацию или enum
-специфические рефлексивные методы.
Как всегда, я настоятельно рекомендую избегать синглтонов.