2013-05-11 2 views
0

Так я всегда создавал потокобезопасный синглтон, чтобы использовать его в многопоточном приложении.Решающее решение для однопоточного и внутреннего класса

public class Logger { 

    private Logger() {} 

    private static Logger instance = new Logger(); 

    public static Logger getInstance() { 
     return instance; 
    } 

    public void log(String s) { 
     // Log here 
    } 
} 

Сегодня я учился брать мой сертификат Java и книги, которую я нашел другое решение:

public class Logger { 

    private Logger() {} 

    private static Logger instance; 

    private static class LoggerHolder { 
     public static Logger logger = new Logger(); 
    } 

    public static Logger getInstance() { 
     return LoggerHolder.logger; 
    } 

    public void log(String s) { 
     // Log here 
    } 
} 

Они не упоминают о другой.

Что лучше? И в чем разница между двумя решениями?

ответ

1

Второй пример менее вероятен для создания экземпляра только потому, что вы получили доступ к классу. Вместо этого вам придется получить доступ к внутреннему классу. Этот уровень паранойи имеет смысл для дизайнеров библиотеки JDK, но в более контролируемой кодовой базе он находится на верхнем ИМХО.

Я предпочитаю простоту и будет использовать это вместо

public enum MyLogger { 
    INSTANCE; 

    public void log(String s) { 
     // log here 
    } 
} 

Я рекомендую категорически против создания класса под названием Logger Существует уже достаточно путаница многих реализаций данного класса доступны в том числе одного встроенной команды.

0

Второй ленивый. Если каким-то чудом программа загружает класс, но никогда не вызывает getInstance(), экземпляр журнала, который может быть дорогостоящим объектом для создания, не будет создан.

Честно говоря, если требуется один синглтон (и с каркасами инъекций зависимостей они почти всегда не нужны), я предпочитаю первое решение, которое легче понять. Я редко, если вообще когда-либо видел один синглтон, чей класс был загружен, но который никогда не использовался в реальном коде.

Смежные вопросы