Сделать перечисление INSTANCE приватным - PullRequest
6 голосов
/ 04 июля 2010

Я использую шаблон синглетного перечисления, как это:

public enum LicenseLoader implements ClientLicense {
    INSTANCE;

    /**
     * @return an instance of ClientLicense
     */
    public static ClientLicense getInstance() {
        return (ClientLicense)INSTANCE;
    }

   ...rest of code

}

Теперь я хочу вернуть Интерфейс и скрыть тот факт, что мы на самом деле используем enum вообще.Я хочу, чтобы клиент использовал getInstance (), а не LicenseLoader.INSTANCE, так как однажды я могу при необходимости использовать другой шаблон.

Можно ли сделать INSTANCE приватной для перечисления?

Ответы [ 2 ]

4 голосов
/ 04 июля 2010

Как насчет создания public interface и private enum этого implements указанного интерфейса с одноэлементной 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 вообще), используя interface для определения своей функциональности, скрывая все детали реализации.

1 голос
/ 04 июля 2010

Доступны все enum константы.Например, с помощью десериализации или специфических enum методов отражения.

Как всегда, я настоятельно рекомендую избегать одиночных разрядов.

...