Default Konstruktor und gutes Design



  • Sollte man, wenn kein Konstruktor benötigt wird, trotzdem einen leeren definieren?

    Sprich:

    class Dummy{
    
      public Dummy(){}
    }
    

    Impliziet generiert Java ja einen, sollte man aus Design Gründen trotzdem selber einen definieren?

    Danke


  • Mod

    Wenn er keinen Sinn macht, solltest du vielleicht einen privaten Standardkonstruktor schreiben, damit ein Nutzer der Klasse nicht die Gelegenheit kriegt, dummerweise den völlig sinnlosen Default-Konstruktor zu nutzen.



  • Hallo und Dake erstmal,

    naja, das Objekt instanziere ich schon über den Defaultkonstruktor,

    Dummy dum = new Dummy();
    

    allerdings nimmt dieser weder Argumente entgegen, noch initialisiert er Variablen.

    Die Klasse enthält nur einen Vektor, welcher über spezielle Methoden manipuliert wird(eigene add/remove Methoden). Ansonsten macht die Klasse nix.

    Ich kann mir es ja sparen, den Default-Konstruktor zu schreiben, da dies ja der Compiler übernimmt(falls keiner vorhanden ist).

    Wie ist es nun mit guten Programmdesign? Sollte man es selber machen(s.o.), oder es dem Compiler überlassen?

    Danke!



  • Gregor schrieb:

    Wenn er keinen Sinn macht, solltest du vielleicht einen privaten Standardkonstruktor schreiben, damit ein Nutzer der Klasse nicht die Gelegenheit kriegt, dummerweise den völlig sinnlosen Default-Konstruktor zu nutzen.

    Höh, wenn du einen eigenen Konstruktor definierst, wird doch eh kein Standardkonstruktor mehr erstellt.



  • Optimizer schrieb:

    Gregor schrieb:

    Wenn er keinen Sinn macht, solltest du vielleicht einen privaten Standardkonstruktor schreiben, damit ein Nutzer der Klasse nicht die Gelegenheit kriegt, dummerweise den völlig sinnlosen Default-Konstruktor zu nutzen.

    Höh, wenn du einen eigenen Konstruktor definierst, wird doch eh kein Standardkonstruktor mehr erstellt.

    😕 Wenn Du keinen Konstruktor erstellst, wird vom Compiler ein leerer erstellt. Oder verstehe ich Dich vielleicht falsch?



  • Hmm, also ich glaube man sollte diesen dann wohl nicht expliziet definieren, da die Java Entwickler dies auch nicht machen(siehe Source von der Number Klasse).


  • Mod

    Java Anfänger schrieb:

    Wie ist es nun mit guten Programmdesign? Sollte man es selber machen(s.o.), oder es dem Compiler überlassen?

    Zeig mal die gesamte Klasse her.

    ...wenn der Default-Konstruktor eh leer ist, dann schreibt man ihn normalerweise nicht selber.


  • Mod

    Optimizer schrieb:

    Höh, wenn du einen eigenen Konstruktor definierst, wird doch eh kein Standardkonstruktor mehr erstellt.

    --> siehe Singleton-Muster. ...aber hast schon Recht: Ich habe wiedermal nicht mitgedacht.



  • Gregor schrieb:

    ...wenn der Default-Konstruktor eh leer ist, dann schreibt man ihn normalerweise nicht selber.

    Danke! Hab mich auch schon an den Java Entwicklern orientiert!


  • Mod

    Zeig trotzdem mal die Klasse. Ich glaube, nach dem, was du bis jetzt gesagt hast, würde ich sie trotzdem anders als du schreiben.



  • public class MyElementVector{
    
      Vector v = new Vector();
    
      public void add(MyElement e){
    
      }
    
      public void remove(int index){
    
      }
    
    }
    

    Die Klasse sollte nur als Datenhalter dienen. Über die eigenen add/remove Methoden stelle ich nur sicher, dass sich Elemente vom Typ MyElement darin befinden.

    AFAIK braucht man dort keinen explizieten Konstruktor.


  • Mod

    Naja, ok. Ist eigentlich in Ordnung (bis auf die Tatsache, dass der Vector als private deklariert werden sollte). ...aber nur, wenn null in den Vector gesteckt werden darf.


  • Mod

    Java Anfänger schrieb:

    Die Klasse sollte nur als Datenhalter dienen. Über die eigenen add/remove Methoden stelle ich nur sicher, dass sich Elemente vom Typ MyElement darin befinden.

    Es wäre in diesem Fall guter Stil, Java 5.0 zu verwenden und einfach einen entsprechend parametrisierten Vector zu nehmen.



  • Danke Gregor!

    Genau deswegen meinte ich, dass ich mir einen explizieten Defaultkonstruktor sparen kann.



  • Gregor meint, du sollst überhaupt nicht so eine Klasse schreiben, sondern Java 5.0 verwenden. Da gehen dann Späße wie

    Vector<MyElement> x = new Vector<MyElement>();
    

Anmelden zum Antworten