3 Stimmen

Wann und warum sollte eine Kindklasse ein statisches Instanzmitglied der Elternklasse deklarieren?

Dies ist ein weiteres Entwurfsmuster in einem älteren Code, über das ich bei Google nicht viel finden konnte. In diesem Fall erweitert eine Kindklasse ihre abstrakte Elternklasse, dreht sich dann aber um und deklariert eine statische Instanz der Elternklasse:

public abstract class MessageBase {
    protected DAOFactory factory;
    // method declarations
}

public class EDWMessage extends MessageBase {
    private static MessageBase instance;

    public static MessageBase getInstance(Properties properties) {
        if (instance == null) {
            instance = new EDWMessageTransaction(properties, null);
        }
        return instance;
    }
//more code
}

Ich bin mir nicht sicher, ob ich verstehe, was der Grund für dieses Entwurfsmuster ist (falls es ein bekanntes Muster ist). Ist dies eine Art Bequemlichkeitsmuster, um zu vermeiden, dass jede Mitgliedsvariable der Elternklasse als statisch deklariert wird? Oder ist es dafür gedacht, dass mehrere Kinderklassen jeweils eine Instanz der Elternklasse haben können. Aber wenn das der Fall ist, warum dann die übermäßige Verwendung von Vererbung anstelle von einfacher Komposition?

Der Rest des Codes gibt keinen Hinweis darauf, warum dies auf diese Weise geschehen sollte. Jeder Gedanke oder jede Idee wäre mir sehr willkommen. Danke!

P.S. Ich scheine auf eine Menge interessanter Leute zu treffen. Entwurf Muster in diesem alten Code, mit dem ich nicht umzugehen weiß. Vielen Dank an alle, die mir bereits geholfen haben.

Edit: Erweiterung des Codebeispiels. Werde wieder editieren, wenn ich irgendwo entdecke, dass dieser Code tatsächlich verwendet wird. Juhu für keine Dokumentation.

3voto

John Vint Punkte 38604

Dies ist ein gängiges Idiom für die thread-sichere Lazy-Singleton-Initialisierung. Wenn Sie eine Singleton-Klasse haben können, delegieren Sie an eine private statische instanziierende Klasse.

public class MySingleton{

   private MySingleton(){

   }

   public static MySingleton getInstance(){
       return SingletonCreator.INSTANCE;
   }

   private static class SingletonCreator{
     private static final MySingleton INSTNACE = new MySingleton();
   }
}

Ich bin nicht sicher, ob Ihre untergeordnete Klasse so verwendet wird, aber dies wäre ein Anwendungsfall für eine untergeordnete Klasse, die eine statische Instanz der übergeordneten Klasse enthält

0voto

Liviu T. Punkte 23444

Die ursprüngliche Absicht war wahrscheinlich, dass es für jede Unterklasse von MessageBase nur eine Instanz geben sollte und dass man auf diese Instanz mit einer gewöhnlichen Methode in der Basisklasse zugreifen kann

Sie können also alle Nachrichtentypen durchlaufen und die Instanz jeder

meine 2 Cents

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X