Ich habe eine schnelle und einfache Frage. Ich habe die Angewohnheit, jede Klasse "final" zu machen, außer natürlich, sie muss um eine weitere erweitert werden.
Ist das eine schlechte Angewohnheit? Eine gute Angewohnheit? Ist es überhaupt wichtig? Ich verstehe die Wirkung des Modifikators auf eine Klasse.
Vielen Dank im Voraus!
Bearbeiten: Hier ist ein Beispielcode. Diese Klasse wird nicht um andere Klassen erweitert.
%Vor%Ich werde aus folgenden Gründen schlechte Angewohnheit sagen:
Zum Beispiel:
%Vor%... ergibt ...
%Vor%Natürlich gibt es gültige Szenarien für das Finalisieren von Klassen. Zum Beispiel ist Ihre Klasse unveränderlich.
Programmierer (sogar Java-Gurus) stimmen dem nicht zu.
Josh Bloch, der die Java Collections-Bibliothek java.Math, assert
entworfen hat und Chief Java-Architekt bei Google ist (oder noch bevor er Gosling eingestellt hat), hat einen Abschnitt seines Buches "Effective Java" diesem Thema gewidmet . Ich gehe mit dem, was er zu sagen hat:
Punkt 17: Design und Dokument für die Vererbung oder verbieten es
Er weist darauf hin, dass Subklassenklassen, die dafür nicht entwickelt wurden, oft zu Desaster führen.
Außerdem ist das Entwerfen für die Vererbung teuer.
Du kannst immer deine Meinung ändern und etwas Nicht-Endgültiges machen. Sie können nicht etwas Finales machen, das nicht endgültig ist.
Lesen Sie "Effektives Java", das macht dieses Argument viel überzeugender. Es wird dich auch zu einem besseren Programmierer machen.
Ich würde sagen, es ist eine schlechte Angewohnheit, weil es bedeutet, dass Sie nicht durch die Entscheidung denken. Der Punkt, die Dinge nicht endgültig zu machen, ist, dass Sie Unterklassen erstellen und Änderungen vornehmen können , ohne den ursprünglichen Code zu ändern . Du brichst das.
Ihre Frage hat keine genaue Antwort. Es hängt davon ab, was der Zweck der Klassen ist, die Sie schreiben. Einige sollten von Natur aus endgültig sein, andere nicht, außer Sie möchten explizit Unterklassen verbieten.
Wenn Sie nur selbst programmieren, denke ich nicht, dass dies einen Unterschied machen würde. Sie würden den Modifikator " final
" jedes Mal entfernen, wenn Sie etwas wissen oder etwas unterklassifizieren müssen.
Abschließend final
Modifier für eine Klasse ist es normalerweise ein Hinweis für jemanden anderen darüber, wie Ihre Klasse verwendet werden sollte, nicht eine echte gute / schlechte Angewohnheit.
Es hat keinen Effekt mit HotSpot, aber ich bin unsicher in Bezug auf andere Laufzeitsysteme. Ich benutze es nie, weil es nutzlos scheint. Während final in einer Variablen (die auch in HotSpot keine Wirkung hat) verhindern kann, dass Sie einen Wert ändern, den Sie nicht möchten, haben Sie nicht wirklich die gleichen Sorgen mit einer Klasse.
Früher spielte es jedoch in HotSpot eine Rolle. Und es kann für etwas wie Android und Dalvik wichtig sein.
Im Allgemeinen ist das keine gute Idee. Wenn die Klassen auf Ihr Projekt beschränkt sind, ist es in Ordnung, dies zu tun. Wenn Sie die Notwendigkeit sehen, einige der Klassen zu erweitern, kann er sie immer als nicht endgültig definieren.
Weil %code% äquivalent zu %code% ist, während %code% standardmäßig auf %code% operation ist, weisen Sie ein int zu, das char umgewandelt werden muss.
Aus der %code% ,
Ein zusammengesetzter Zuordnungsausdruck der Form E1 op = E2 ist äquivalent zu E1 = (T) ((E1) op (E2)), wobei T der Typ von E1 ist, außer dass E1 wird nur einmal ausgewertet. Beachten Sie, dass die implizierte Umwandlung für Typ T sein kann entweder eine Identitätskonvertierung (? .1.1) oder ein sich verengendes Primitiv Umwandlung (? .1.3).
Frage:
%Vor%