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
Antwort
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.
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 :-) –
HotSpot legt fest, ob die Klasse eine Unterklasse geladen hat. Es macht keinen Unterschied, ob die Klasse "final" ist oder nicht. –
@Tom, danke, das bestätigt mein Gefühl :-) –
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.
Ja, das habe ich gerade gesehen. Es tut uns leid. Ich habe den Downvote entfernt. – Hardcoded
@Hardcoded, kein Problem :-) –
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.
"Oft betrachtet" von wem? [Zitat benötigt] –
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
@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. –
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.
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.
- 1. private static final String oder private final String
- 2. Okay, Private Final Method von Constructor aufrufen?
- 3. Private Konstruktor und Vererbung (Java)
- 4. Mock private statische final String mit Mockito
- 5. abstrakte Klasse vs private Konstruktor
- 6. Android: Ändern private static final Feld mit Java Reflexion
- 7. Java innere Klasse private Konstruktor, öffentliche Mitglieder
- 8. JavaScript private Variablen mit Konstruktor Prototyp
- 9. Was ist der private Konstruktor in C#?
- 10. NLog und final rules
- 11. String und Final
- 12. schneller Unterschied zwischen final var und non-final var | Finale let und nicht-final lassen
- 13. Java-Konstruktor und Feldinitialisierungsreihenfolge
- 14. Swift Final Classes und Funktionen
- 15. "final" -Klasse Implementierung in C++
- 16. Deklaration der Variablen final und statisch
- 17. Everything's Final
- 18. Öffentlicher Konstruktor und statischer Konstruktor
- 19. Speichern von Funktionszeiger von Konstruktor auf private Variable
- 20. Tuple struct Konstruktor beschwert sich über private Felder
- 21. Android: Dolch 2 und Konstruktor Injektion
- 22. Der richtige Einsatz von final
- 23. was in Groovy final bedeutet die
- 24. Konstanten in Ruby und Java Schlüsselwort final
- 25. Offen-geschlossen-Prinzip und Java-Modifikator "final"
- 26. AutoFixture und private Eigenschaften
- 27. private Sende- und Empfängerberechtigungen
- 28. Polymorphismus und private Datenelemente
- 29. Private Methoden und Felder
- 30. Konstruktor Parameter und Vererbung
Methode -> Konstruktor? meinst du nicht eine Klasse? –
s/Methode/Klasse /? (: – hudolejev
eine Klasse als final markieren, meinst du? – lindelof