2016-05-02 8 views
-1

Ich habe heute einen Code durchlaufen. Und ich entdeckte etwas wie folgt aus:Welche Verdienste haben wir, um ein privates Finale der inneren Klasse zu machen?

public class SomeClass 
{ 
    ... 
    final private class SomeHandler implements Blahblah 
    { 
     ... 
    } 
} 

Da niemand sollte SomeHandler von außen zugreifen können, ich verstehe nicht, warum wir es final machen sollte. Hat jemand eine andere Einsicht?

+2

Fragen Sie, warum sollte es endgültig sein, oder warum sollte es privat sein? – CubeJockey

+0

Bester Fall: Es ist endgültig, weil der Autor klarstellen wollte, dass keine Klasse die 'SomeHandler'-Klasse erweitern sollte. – DwB

+0

@CubeJockey Ich frage "warum sollte es endgültig sein". – shinkou

Antwort

2

Die Deklaration einer Klasse als final hat zwei verwandte, aber unterschiedliche Zwecke.

  1. Er teilt dem Compiler mit, dass diese Klasse nicht erweitert werden darf. Dies geschieht hauptsächlich, um Fehler zu vermeiden.

  2. Es sagt dem Leser "mach dir keine Sorgen, dass diese Klasse erweitert werden könnte". Dies dient dem besseren Verständnis.

Im Falle einer private final inneren Klasse, können wir davon ausgehen, dass eine Person schreibt oder die Klasse ändert und dass sie tun es nach dem Entwurf zu verstehen. Daher ist die Wahrscheinlichkeit gering, dass jemand fälschlicherweise eine Klasse erweitert, die nicht (vom Design her) erweitert werden sollte.

Allerdings muss jemand, der den Code liest, der wissen muss, dass die private innere Klasse möglicherweise erweitert wurde, die gesamte Java-Quelldatei scannen muss ... es sei denn, die Klasse wurde final deklariert.

Daher könnte final einen nützlichen Zweck ... dienen, um das Design manifest zu machen, um die Lesbarkeit zu verbessern.


Auf der anderen Seite, die final im Beispiel Sie ohne besondere Absicht hinzugefügt worden sein könnte gefunden; d.h. es könnte einfach "redundant" sein.

+0

+1 Ich würde nur hinzufügen, dass eine * gut gestaltete * Java-Klasse fast immer "final" gemacht werden sollte, außer wenn sie * absichtlich * für die Erweiterung durch Sub-Classing gedacht ist. Die Tatsache, dass Klassen in der Java-Sprache standardmäßig nicht endgültig sind, war ein Sprachentwicklungsfehler, der von der Mentalität der 80er/90er herrührte, dass eine häufige (Ab-) Verwendung der Klassenvererbung eine gute Idee war. Moderne Werke wie die Bücher "Effektives Java", "Praktisches API-Design" und "API-Design für C++" empfehlen, Klassen standardmäßig "final" zu machen und "virtuelle" Methoden generell zu vermeiden. –

+0

Wenn eine innere Klasse in einer großen Klasse deklariert wird, hilft das Hinzufügen des Schlüsselworts final bei der Suche nach Code. Daran habe ich noch nicht gedacht, guter Punkt! :) – shinkou

+0

@ Rogério Interessant. Aber ich erinnere mich, dass ich einmal wünschte, ich könnte eine der Methoden in einer Klasse in einer 3rd-Party-Bibliothek (Open Source) außer Kraft setzen, die fehlerhaft war. Ich habe die gesamte Klasse kopiert und in meinem eigenen Code geändert. Nur _well-designed_ ist nicht genug, IMO. – shinkou