2013-07-24 3 views
1

Я хочу использовать следующий шаблон для создания синглтона в JavaСоздание ява одноточечно со статическим внутренним классом

public class Singleton { 
     // Private constructor prevents instantiation from other classes 
     private Singleton() { } 

     /** 
     * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
     * or the first access to SingletonHolder.INSTANCE, not before. 
     */ 
     private static class SingletonHolder { 
       public static final Singleton INSTANCE = new Singleton(); 
     } 

     public static Singleton getInstance() { 
       return SingletonHolder.INSTANCE; 
     } 
} 

Но что происходит, когда частный конструктор я хочу назвать это

private Singleton(Object stuff) {... } 

Как я пропускаю stuff до INSTANCE = new Singleton()? Как и в INSTANCE = new Singleton(stuff);

Переписывая выше фрагмент кода:

public class Singleton { 
     // Private constructor prevents instantiation from other classes 
     private Singleton(Object stuff) { ... } 

     /** 
     * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
     * or the first access to SingletonHolder.INSTANCE, not before. 
     */ 
     private static class SingletonHolder { 
       public static final Singleton INSTANCE = new Singleton(); 
     } 

     public static Singleton getInstance(Object stuff) { 
       return SingletonHolder.INSTANCE;//where is my stuff passed in? 
     } 
} 

EDIT:

для тех из вас, утверждая, что этот шаблон не поточно, читайте здесь: http://en.wikipedia.org/wiki/Singleton_pattern#The_solution_of_Bill_Pugh.

Объект, который я передаю, представляет собой контекст приложения Android.

+1

Почему, по вашему мнению, вам нужен синглтон в вашем приложении? –

+4

Ваше описание, вероятно, является признаком того, что вы не должны использовать синглтон. В частности, что происходит, если вы вызываете: 'Singleton.getInstance (object1); Singleton.getInstance (object2); '???У вас теперь есть два примера вашего синглтона? Вы мутируете первый экземпляр? и т. д. – assylias

+3

@ LuiggiMendoza, если вы хотите сделать так, сделайте это. Я не буду писать диссертацию о том, зачем мне нужен синглтон. –

ответ

0
public class Singleton { 
     private static Singleton singleton; 

     // Private constructor prevents instantiation from other classes 
     private Singleton() { } 

     public void addStuff(Object stuff){}  

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

и использовать его как:

Singleton s = Singleton.getInstance(); 
s.addStuff(stuff); 

или альтернативного

public class Singleton { 
     private static Singleton singleton; 

     // Private constructor prevents instantiation from other classes 
     private Singleton() { } 

     public static void redefine(Object stuff){ 

      singleton = new Singleton(stuff) // choose constructor based on parameters 
     } 


     public static Singleton getInstance() { 
       return singleton; 
     } 
} 
+0

Я подумал об этом. Но я задавался вопросом о более инклюзивном подходе. –

+0

Я отредактировал ответ, возможно, это желание, которое вы искали? –

5

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

Если ваша цель состоит в том, чтобы добавить некоторую конфигурацию, когда создаются единственным экземпляр, самый простой способ будет иметь ваш одноэлементный запрос для получения информации о конфигурации, когда она конкретизируется:

public static final Singleton INSTANCE = new Singleton(getConfiguration()); 

где getConfiguration возвращает то, что является (будь то чтение файла или пересылка какой-либо другой переменной, например).


Обычная оговорка: Singletons are evil.
Дополнительный ресурс: Google guide to writing testable code (на случай, если вы не были уверены в первый раз).

-1

Почему бы не избавиться от шаблона фабрики SingletonHolder. Вам нужно будет решить, что делать, когда пытаетесь дважды вызвать getInstance, но с другим «материалом».

public class Singleton { 

    private static Singleton singleton 
    private final Object stuff; 

    private Singleton(Object stuff) { 
     this.stuff = stuff; 
    } 

    public static synchronized Singleton getInstance(Object stuff) { 
     if (singleton == null) { 
      singleton = new Singleton(stuff); 
      return singleton; 
     } 

     return singleton; // or throw error because trying to re-init 
    } 
} 
+0

'или забросить ошибку, потому что пытаетесь перезапустить «Это побеждает цель одноэлементного –

+0

Согласовано, но идет с потоком вопроса. Я бы, вероятно, не использовал params в singleton –

+0

@assylias Что я пропустил относительно безопасности потоков? Я не могу это понять. CHeers –

0

Вы можете прочитать

a singleton with parameters is not a singleton

Первый ответ доказывает, почему >> синглтон с параметрами < < не синглтон, и не подходи одноплодной.

+0

Это должен быть комментарий, а не ответ, но спасибо за Q/A. –

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