2010-06-02 14 views
12

Warum ist es eine gute Übung, eine Klasse mit nur privaten Konstruktoren als endgültig zu markieren? Meine Vermutung ist, andere Programmierer wissen zu lassen, dass sie nicht unterklassifiziert werden können.private Konstruktor und final

+0

Methode -> Konstruktor? meinst du nicht eine Klasse? –

+0

s/Methode/Klasse /? (: – hudolejev

+0

eine Klasse als final markieren, meinst du? – lindelof

Antwort

5

Das Erstellen eines Klassenabschlusses hat einen gewissen (kleinen) Leistungszuwachs, da der JIT-Compiler Funktionen dieser Klasse inline ausführen kann. Ich weiß nicht, ob das als "gute Praxis" gilt, aber ich sehe die Vorteile.

+1

Sieht der JIT-Compiler sowieso nicht, ob in dieser Klasse konkrete Unterklassen geladen sind und ob eine Methode überschrieben wird? Ich würde mir vorstellen, dass sie in diesem Fall inline sein kann, unabhängig davon, ob die Klasse/Methode als 'final' deklariert ist oder nicht Dann wieder, ich bin kein JIT-Experte, nur neugierig :-) –

+6

HotSpot legt fest, ob die Klasse eine Unterklasse geladen hat. Es macht keinen Unterschied, ob die Klasse "final" ist oder nicht. –

+0

@Tom, danke, das bestätigt mein Gefühl :-) –

4

Sie meinen "eine Klasse mit privaten Konstruktor" Sie?

Eine letzte Klasse kann nicht unterklassifiziert werden. Dies kann eine Designentscheidung darstellen. Nicht alle Klassen sind so konzipiert, dass sie unterklassifiziert werden. Wenn dies nicht der Fall ist, ist es am besten, sie explizit zu markieren, um spätere Fehler zu vermeiden.

Eine Klasse mit privaten Konstruktoren kann nicht von der Außenwelt instanziiert werden (weder unterklassifiziert). Dies kann z.B. Singletons oder Klassen, in denen Sie steuern möchten, welche Instanzen der Klasse erstellt werden. Z.B. vor Java5 verwendete das typesafe enum Muster dies.

+0

Ja, das habe ich gerade gesehen. Es tut uns leid. Ich habe den Downvote entfernt. – Hardcoded

+0

@Hardcoded, kein Problem :-) –

12

Es wird häufig (z. B. von Josh Bloch und den Designern von C#) empfohlen, alles als endgültig zu markieren, es sei denn, Sie haben einen ausdrücklichen Grund, dies nicht zu tun. Angenommen, Sie meinen eine Klasse, dann ist es richtig, dass eine Klasse mit nur privaten Konstruktoren nicht unterklassifiziert werden kann. Somit könnte das Finale als überflüssig betrachtet werden, aber wie Sie sagen, hat es einen Wert für die Dokumentation. Wie Marc vorschlägt, kann es auch zur Optimierung beitragen.

+0

"Oft betrachtet" von wem? [Zitat benötigt] –

+1

alles als endgültig markieren? Ich denke du meinst Variablen und Parameter. Es ist jedoch keine gute Idee, alle Klassen und Methoden als endgültig zu markieren. Dies würde die Erweiterbarkeit Ihrer Anwendung dynamisch begrenzen. – Hardcoded

+4

@Hardcoded, schrieb er "markieren Sie alles als endgültig **, es sei denn, Sie haben einen ausdrücklichen Grund nicht zu **". I.e. Sie erlauben nur die Erweiterung von Klassen _designed, um erweiterbar zu sein. –

2

Wir markieren die Klasse als letzte Klasse, indem wir Konstruktor als privat definieren, um Unterklassen zu vermeiden.

Dies ist eine gute Methode, wenn wir nicht wollen, dass Leute unsere Klassenmethoden überschreiben und die Funktionalität ändern oder die Funktionen zu unserer Klasse hinzufügen.

Zum Beispiel sind die Klassen String und Math finale Klassen, die wir nicht erweitern oder unterklassen können, um sicherzustellen, dass niemand ihr Verhalten ändert.

1

Eine letzte Klasse mit privaten Konstruktor:

  • Klasse Unterklassen nicht haben, können wir letzte Klasse nicht weit.
  • Klasse mit privaten Konstruktor, wir können das Objekt dieser Klasse nicht erstellen.

Es bedeutet, dass andere Methoden der Klasse statisch sind, so dass die Klasse auf sie zugreifen kann.