2011-01-03 21 views
4

Ich möchte die Implementierung des Singleton-Muster für jede der erweiterten Klassen meiner Elternklasse erzwingen. Das heißt, ich möchte nur eine Instanz jeder Kindklasse haben (erreichbar über Child.INSTANCE oder etwas Ähnliches).Statische/Endgültige Java-Klassen?

Idealerweise möchte ich, dass das Child.INSTANCE -Objekt erstellt wird und dann kein anderes Objekt vom Typ Parent erstellt wird.

Derzeit erhalte ich meine Fällen durch so etwas wie:

public class Child extends Parent { 
    public static final Child INSTANCE = new Child(); 
    .... 

Ich frage mich, kann eine Java-Klasse in irgendeiner Weise gemacht statisch oder etwas sein?

Danke =]

+1

Um einen Teil der Frage zu beantworten: innere Klassen können statisch gemacht werden; Was den Rest der Frage betrifft, bin ich mir nicht ganz sicher, ob das Gesuchte auch erledigt werden kann. –

+1

Versuchen Sie, eine einzelne Instanz jeder Klasse im Vererbungsbaum oder nur eine einzige Klasse für die gesamter Baum? –

+0

Danke, das war mir allerdings bewusst. Leider würde das meine Klasse unangemessen lang machen - und ich denke, ich müsste das Elternteil zu einem statischen inneren machen ... – Dartoxian

Antwort

9

Ist der Satz Ihrer untergeordneten Klassen festgelegt? Wenn ja, erwägen Sie die Verwendung eines enum.

public enum Parent { 
    CHILD1 { 
     // class definition goes here 
    }, 

    CHILD2 { 
     // class definition goes here 
    }; 

    // common definitions go here 
} 

Da die OP über Zustandsmuster erwähnt, sind hier zwei Beispiele von enum -basierte Zustandsmaschinen: a simple one und a complex one.

+0

Set von Childs Ich erwarte sehr groß zu sein und zu wachsen – Dartoxian

+1

@Dartoxian: Richtig, aber muss es zur Laufzeit wachsen, oder dürfen Sie neu kompilieren? Wenn Letzteres, ist dies immer noch geeignet. –

+1

Ja rekompilieren ist, was passieren wird. Danke für den Link - es sieht wie ein sehr nützlicher Zeiger aus =] – Dartoxian

1

Es kann getan werden, aber ich sehe den Punkt nicht. Sie wären besser dran mit einem Enum IMHO.

enum { 
    Singleton, 
    Child { /* override methods here * } 
} 

immer Sie Fragen zu beantworten, können Sie den folgenden

class SingletonParent { 
    private static final Set<Class> classes = new CopyOnArraySet(); 
    { if (!classes.add(getClass()) throw new AssertionError("One "+getClass()+" already created."); } 
} 
1

am falschen Entwurfsmuster Sie suchen tun.

Werfen Sie einen Blick auf das Factory-Muster. Eine Fabrik kann eine einzelne Instanz einer Klasse erstellen und sie dann an jeden weitergeben, der sie haben möchte. Die Fabrik kann ein Singleton des Elternteils, eines Kindes oder etwas anderes, das Sie wollen, verteilen.

0

Sie können ein Java enum verwenden. Im Grunde macht es eine Reihe von öffentlichen statischen Klassen (wie Sie), aber legt ein paar Einschränkungen für sie fest.

public enum Child { 
    INSTANCE; 
} 

Beachten Sie, dass enums volle Klassen sind, so dass Sie leicht Methoden auf einer Pro-Instanz Basis hinzufügen können, wenn Sie es wünschen.

0

Ich werde mit einer question beantworten Ich fragte eine Weile zurück, die sehr ähnlich war. Ich glaube, dass dies tun wird, was Sie wollen, aber es kommt mit allen Einschränkungen, die in den Antworten erwähnt werden.