2010-04-26 3 views
6

ist eine Frage, über Stil Codierung und Empfehlungen:Setzen Sie einen super() -Aufruf an den Anfang Ihrer Konstruktoren? Diese

Wie in den Antworten auf die Frage unnecessary to put super() in constructor?, wenn Sie einen Konstruktor für eine Klasse schreiben, die angeblich den Standard verwenden (ohne Argumente) Konstruktor von der Super, können Sie super() am Anfang Ihres Konstruktor aufrufen:

public MyClass(int parm){ 
    super(); // leaving this out makes no difference 
    // do stuff... 
} 

aber Sie können den Anruf auch weglassen; Der Compiler wird sich in beiden Fällen so verhalten, als ob der Aufruf von super() da wäre.

Also, haben Sie den Aufruf in Ihre Konstruktoren oder nicht?

Auf der einen Seite könnte man argumentieren, dass die Einbeziehung der super() die Dinge deutlicher macht. OTOH, ich mag es nicht, redundanten Code zu schreiben, also tendiere ich dazu, es auszulassen; Ich sehe es jedoch regelmäßig im Code von anderen.

Was sind Ihre Erfahrungen? Hattest du Probleme mit dem einen oder anderen Ansatz? Haben Sie Kodierungsrichtlinien, die einen Ansatz vorschreiben?

BTW: Eine weitere Frage (nur als Referenz):

Is there a reason to explicitly code a default constructor when there are no other constructors?

+0

Ich nicht, aber möglicherweise weil fast der ganze Code, den ich gelesen habe (und von gelernt habe) nicht. Ich könnte einfach den schlechten Stil verewigen, den ich gelernt habe. –

Antwort

20

ich die super() Anruf aus dem gleichen Grund nicht schreiben Ich schreibe keine unnötigen Würfe:

Sie fügt hinzu, Rauschen in den Code ohne zusätzliche Informationen (weder an den Compiler noch an den Entwickler meinen Code lesen).

+3

+1 für "Vermeidung von Lärm". Code ist schon schwer genug, um schon zu lesen ... – sleske

4

Die Standardeinstellungen von einigen Versionen von einigen IDEs erzeugen automatisch, so dass ein Grund ist man es sehen könnte.

Ob Sie es schreiben oder nicht hängt davon ab, wer es lesen wird. Ich ziehe es vor, es nicht hinzuzufügen, aber wenn Sie nicht sicher sind, dass die Teammitglieder verstehen, was der Compiler macht und wie die Konstruktion des Objekts fortschreitet, können Sie es "nur für den Fall" hinzufügen.

+7

Wenn Sie nicht sicher sind, Teammitglieder zu verstehen, was der Compiler tut, dann haben Sie ernstere Probleme ... – sleske

+1

true :) (15chrs) – Bozho

4

Das tue ich nicht, aber das Argument, das mir während des Studiums gegeben wurde, war, dass es die Dinge expliziter macht, also vergisst man nicht, dass ein Superklassenkonstruktor aufgerufen wird.

Ich sehe nur nicht die Notwendigkeit tho.

2

Was sind Ihre Erfahrungen? Hast du Probleme mit dem einen oder anderen Ansatz?

ich nie den Standard-Konstruktor aufgerufen (explizit) und konfrontiert nie Probleme

+0

-1 Sie haben wahrscheinlich ... implizit – Tomas

+0

@Tomas - ja natürlich, behoben es - jetzt glücklich? – stacker

1

Ich füge es nie hinzu und ich war zutiefst geschockt, als ein Kollege nicht verstand, dass es einen impliziten Aufruf an die Superklasse gab, also sollte ich vielleicht damit anfangen.

+8

Oder vielleicht solltest du stattdessen anfangen, deinen Kollegen zu erziehen ;-) –

0

Ich habe tatsächlich die super() Anruf in, wie ich finde es eine hilfreiche Gedächtnisstütze. Wenn ich vor ein paar Monaten ein Stück Code geschrieben habe und zu ihm zurückgekehrt bin, erinnert mich die super(), wenn ich den Konstruktor ansehe, dass die Klasse, die ich geschrieben habe, von etwas erbt.

+4

Ist das nicht die Tatsache, dass am Anfang der Klasse "erweitert" wird ;-)? – sleske

+0

Es wäre, wenn der Konstruktor und die Klassendefinition gleichzeitig angezeigt werden könnten, was nicht immer der Fall ist. Ich setze generell alle meine Attribute vor meine Methoden. –

1

Ich benutze die super() nur, wenn der Konstruktor super() Parameter benötigt.

+3

Natürlich, aber das ist eine ganz andere Situation: Wenn Sie Parameter übergeben müssen, müssen Sie * explizit * super (parms) nennen, es ist also keine Frage des Codierungsstils mehr ... – sleske

1

Vorteil: Jeder, der Ihren Code liest, weiß, dass Sie wirklich den Standardkonstruktor aufrufen möchten, Sie haben den Aufruf nicht versehentlich verlassen.

Nachteil: Sie durcheinander Ihren Code mit unwichtigen Informationen.

Normalerweise, wenn eine Sprache lässt Sie einige Anweisungen weglassen, ist es nicht schlecht Stil dies tun. Ich denke, es geht darum, das Für und Wider abzuwägen. Wenn Sie zum Beispiel explizit super() schreiben, wenn Ihr Konstruktor über Parameter verfügt und die Basisklasse auch über parametrisierte Konstruktoren verfügt, kann dies eine gute Idee sein.

0

Ich versuche zu vermeiden, Code zu schreiben, wo Aufruf von Super() notwendig ist, weil ich Zusammensetzung über Vererbung bevorzuge.

Wenn ich von einer anderen Klasse ableiten muss, versuche ich beide hinter eine eigene Schnittstelle zu setzen und eine davon als Abhängigkeit an die andere zu übergeben.

Wenn ich jedoch eine Lib-Klasse habe, die ich keine zusätzliche Abhängigkeit geben kann, ist das erste, was ich versuche, einen Dekorator zu verwenden.

Wenn dies nicht funktioniert, und ich habe von einer Implementierung abzuleiten, ich denke, es ist, ob keine Rolle super() oder nicht zu schreiben, da es so selten vorkommt;)

Also, alles in allem Ich denke, diese Frage ist sinnlos.

Verwandte Themen