'final' Modifizierer für eine Klasse in Java

8

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%     
Martin Tuskevicius 01.08.2011, 23:52
quelle

7 Antworten

7

Ich werde aus folgenden Gründen schlechte Angewohnheit sagen:

  • Sie haben keinen besonderen Bedarf für die Klasse angegeben, die endgültig sein soll.
  • Sie verstoßen gegen das Prinzip open / closed . Klassen sollten zur Erweiterung geöffnet sein, aber für Änderungen geschlossen sein.
  • Abgeschlossene Klassen können mit spöttischen Frameworks schwer zu testen sein.

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.

    
hoipolloi 02.08.2011, 00:29
quelle
8

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.

  1. Es gibt große Einschränkungen für das, was Ihre Klasse tun kann
  2. Sie müssen mehr Dokumentation schreiben, damit Autoren von Unterklassen wissen, wie öffentliche Methoden intern von der Klasse
  3. verwendet werden
  4. Sie müssen es testen. Dies erfordert das Testen der schreibenden Unterklassen

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.

    
Philip JF 02.08.2011 02:09
quelle
7

Es ist eine gute Angewohnheit. Das Ändern einer finalen Klasse in nonfinal sollte keinen Code brechen. Wenn Sie eine nicht finale Klasse in "final" ändern, wird möglicherweise Code beschädigt.

    
emory 02.08.2011 00:07
quelle
5

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.

    
Scott C Wilson 01.08.2011 23:59
quelle
2

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.

    
Jack 01.08.2011 23:56
quelle
0

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.

    
JasonN 01.08.2011 23:58
quelle
0

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.

    
fastcodejava 02.08.2011 00:10
quelle

Tags und Links

Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ tag123casting ___ Casting ist ein Prozess, bei dem ein Objekttyp explizit in einen anderen Typ konvertiert wird, wenn die Konvertierung zulässig ist. Dieser Prozess könnte zu einer Wertänderung führen. ___ tag123compoundoperator ___ In C-ähnlichen Sprachen kann "x = x + y" als "x + = y" codiert werden. Dies ist ein zusammengesetzter Operator. Es gibt einen solchen Operator für jeden arithmetischen, logischen und bitweisen Operator. ___ answer6844948 ___

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).

    
___ qstntxt ___

Frage:

%Vor%     
Was ist der Unterschied von x = x + 3 und x + = 3? Warum braucht man Typcast und der andere nicht? ___