2012-04-09 12 views
0

Ich habe ein Singleton-Objekt, das auf einer meiner Basisklassen erstellt wird.Software Design, Lesbarkeitsproblem, statische vs Instanz Methode

public class SomeClass 
{ 
    private static final MySingletonClass _singletonObject = new MySingletonClass() 

    protected final getSingletonObject() 
    { 
     return _singleonObject; 
    } 
} 

Ich bin unentschlossen, wenn ich die Methode statisch machen sollte oder nicht. Mein Entwurf sagt, dass die Methode sollte statisch sein, weil das Objekt statisch ist, aber mein "Benutzer" Geist sagt, dass die Methode eine Instanz sein sollte, da die Verwendung dieses Objekts nur sinnvoll ist, wenn innerhalb eines abgeleiteten Klassenmitglieds zugegriffen wird.

public class SomeDerivedClass extends SomeClass 
{ 

    public void someMethod() 
    { 
    // If static can be used SomeClass.getSingletonObject() 
    getSingletonObject(); 
    } 
} 

Die Verwendung ist genau das gleiche die einzige visuelle Unterschied Art und Weise ist, dass die IDEs behandeln statische und Instanzmethoden, nicht signifikant durch meine Frage.

Antwort

0

Der bessere Weg, dies zu tun, ist wie folgt, wo immer erforderlich. Singleton kann durch die Klasse durchgesetzt werden selbst eher als eine andere Klasse, die für sie tun (es sei denn Sie eine DI-Container wie im Frühling verwenden, in dem Fall, dass Sie Feder lassen verwalten, die für Sie)

MySingletonClass.getInstance().doStuff() 

EDIT basierend auf Kommentare

Erklären Sie es wie folgt und alle Ihre untergeordneten Klassen teilen die gleiche Instanz.

und greifen Sie darauf wie folgt zu, d. H. Verwenden Sie den Superklassennamen als Qualifikationsmerkmal in Ihren untergeordneten Klassen. Denken Sie daran, die statischen Instanzen werden nie vererbt ...

public class SomeDerivedClass extends SomeClass 
{ 
    public void someMethod() 
    { 
    SomeClass.INSTANCE.doStuff() 
    } 
} 
+0

Das löst mein Problem nicht, da ich nicht möchte, dass die Instanz für alle Klassen publiziert wird, nur für Unterklassen der SomeClass. – DVD

+0

Dann sollte es nicht statisch sein, nur um es endgültig zu machen. –

+0

Aber ich möchte, dass das Objekt von mehreren abgeleiteten Klassen Instanzen xD – DVD

0

Sie müssen sich erinnern, Konstruktor einer Singleton-Klasse ist privat !!! Sie können also kein Objekt direkt für die Singleton-Klasse erstellen. Bitte sehen Sie den Code, unter dem Ihre Frage gerecht wird:

public class MySingletonClass { 

    //static variable for the singleton instance in tracked here 
    private static MySingletonClass instance = null; 

    private MySingletonClass() { 

    } 

    public static synchronized MySingletonClass getInstance() { 
     if(null == instance) { 
      instance = new MySingletonClass(); 
     } 

     return instance; 
    } 
} 

public class SomeClass { 
    //Already static instance is instance is tracked in MySingletonClass, no need of declaring a static variable here 
    //private static final MySingletonClass _singletonObject = new MySingletonClass() 

    protected final MySingletonClass getSingletonObject() 
    { 
     //This will return the static instance of the MySingletonClass class. 
     return MySingletonClass.getInstance(); 
    } 
} 

Bitte lassen Sie mich wissen, ob Sie genauer beantworten müssen.