2015-09-03 3 views
4

Лучше объявить экземпляр Singleton как static или как static final?Синглтонский шаблон: статический или статический финал?

Смотрите следующий пример:

static версия

public class Singleton { 

    private static Singleton instance = new Singleton(); 

    private Singleton() { 
    } 

    public static Singleton getInstance() { 
     return instance; 
    } 

} 

static final версия

public class Singleton { 

    private static final Singleton INSTANCE = new Singleton(); 

    private Singleton() { 
    } 

    public static Singleton getInstance() { 
     return INSTANCE; 
    } 

} 
+1

Прочитайте [здесь] (http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-singleton-pattern-in-java) о реализации. – alex2410

ответ

-2

Люди используют только static для учета отложенной инициализации.

public class Singleton { 

    private static Singleton instance = null; 

    private Singleton() { 
    } 

    public static Singleton getInstance() { 
     if (instance == null) 
      instance = new Singleton(); 
     return instance; 
    } 

} 

Таким образом, вам не нужно всегда хранить экземпляр, даже если ваше приложение не использует его вообще. Создайте его только при первой необходимости приложения.

+3

Небезопасная реализация потока – alex2410

+0

Безопасность резьбы также зависит от других полей объекта. И вопрос OP был о том, чтобы быть окончательным или нет ... – Codebender

2

В ваших конкретных случаях нет никакой разницы. И ваш второй уже effectively final.

Но

Держа в стороне тот факт, что ниже реализации не является потокобезопасным, просто показывает разницу по отношению к окончательным.

В случае ленивой инициализации вашего экземпляра вы можете почувствовать разницу. Посмотрите ленивую инициализацию.

public class Singleton { 

    private static Singleton INSTANCE; /error 

    private Singleton() { 
    } 

    public static Singleton getInstance() { 
     if (INSTANCE ==null) { 
     INSTANCE = new Singleton(); //error 
     } 
     return INSTANCE; 
    } 

} 
+1

Небезопасная реализация – alex2410

+0

@ alex2410 Это просто ради различия в случае финала. Не проблема безопасности потоков. –

+0

Это просто решение на основе ошибок – alex2410

0

Если вы не хотите быть ленивым (и делать ленивая инициализация), то вы можете сделать это final, потому что вы можете (ПРЕДНАМЕРЕННО) сделать что-то вроде этого:

class Sample { 
    static Object o = new Object(); // o is not final. Hence can change. 
    static{ 
    o = new Object(); 
    o = new Object(); 
    } 
} 

Я бы предложил Singleton вместо Enum.

+1

Я не понимаю этого решения: почему этот фрагмент кода? –

+1

@user - Это объясняет, почему полезно использовать 'final' в текущем коде OP – TheLostMind

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