Синглтон ленивый шаблон загрузки - PullRequest
2 голосов
/ 19 февраля 2012

Я пытаюсь написать шаблон отложенной загрузки синглтонов.Вот класс:

public class IMDBLookup {

    private static class LazyLoad {
        private static final IMDBLookup IMDB_LOOKUP;

        static {
            IMDB_LOOKUP = new IMDBLookup();
        }
    }

    public static IMDBLookup getInstance() {
        return IMDBLookup.LazyLoad.IMDB_LOOKUP;
    }
}

Мне интересно, правильно ли я это делаю?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 19 февраля 2012

Я предпочитаю использовать enum для простоты.

public enum IMDBLookup {
    INSTANCE;
    // add fields and methods here.
}
1 голос
/ 14 октября 2012
public class IMDBLookup {

    private IMDBLookup(){
        // without this I do not get why is it a singleton
        // anyone could create instances of your class by the thousands
    }

    private static class LazyLoad {
        private static final IMDBLookup IMDB_LOOKUP;

        static {
            IMDB_LOOKUP = new IMDBLookup();
        }
    }

    public static IMDBLookup getInstance() {
        return IMDBLookup.LazyLoad.IMDB_LOOKUP;
    }
}

и вам, вероятно, следует использовать enum (не совсем уверен, что я делаю это правильно)

public class IMDBLookup {

    private IMDBLookup(){
    }

    private static enum LazyLoad {
        IMDB_LOOKUP_INSTANCE;
        private static final IMDB_LOOKUP = new IMDBLookup();
    }

    public static IMDBLookup getInstance() {
        return LazyLoad.IMDB_LOOKUP_INSTANCE.IMDB_LOOKUP;
    }
}
1 голос
/ 19 февраля 2012

Это правильно.Вы можете упростить внутренний класс (владельца) как private static final IMDBLookup IMDB_LOOKUP = new IMDBLookup(); для краткости (чтобы избавиться от статического блока инициализатора.)

...