691 Stimmen

Was ist der Sinn von "final class" in Java?

Ich lese ein Buch über Java und es sagt, dass Sie die gesamte Klasse als deklarieren können final . Ich kann mir nicht vorstellen, wo ich das verwenden würde.

Ich bin noch neu im Programmieren und frage mich wenn Programmierer dies tatsächlich in ihren Programmen verwenden . Wenn ja, wann verwenden sie es, damit ich es besser verstehen und wissen kann, wann ich es verwenden muss.

Wenn Java objektorientiert ist, und Sie eine Klasse deklarieren final Wird dadurch nicht die Idee, dass Klassen die Eigenschaften von Objekten haben, aufgegeben?

7voto

Ben Wu Punkte 393

Seien Sie vorsichtig, wenn Sie eine Klasse "endgültig" machen. Denn wenn Sie einen Einheitstest für eine finale Klasse schreiben wollen, können Sie diese finale Klasse nicht unterklassieren, um die Technik der Abhängigkeitsaufhebung "Subclass and Override Method" zu verwenden, die in Michael C. Feathers Buch "Working Effectively with Legacy Code" beschrieben wird. In diesem Buch sagt Feathers: "Im Ernst, es ist leicht zu glauben, dass sealed und final ein falscher Fehler sind, dass sie niemals zu Programmiersprachen hätten hinzugefügt werden dürfen. Aber der wahre Fehler liegt bei uns. Wenn wir uns direkt auf Bibliotheken verlassen, die sich unserer Kontrolle entziehen, ist das ein gefundenes Fressen für Probleme."

5voto

mel3kings Punkte 7889

UM DAS PROBLEM DER LETZTEN KLASSE ZU LÖSEN:

Es gibt zwei Möglichkeiten, eine Klasse endgültig zu machen. Die erste ist die Verwendung des Schlüsselworts final in der Klassendeklaration:

public final class SomeClass {
  //  . . . Class contents
}

Die zweite Möglichkeit, eine Klasse endgültig zu machen, besteht darin, alle ihre Konstruktoren als privat zu deklarieren:

public class SomeClass {
  public final static SOME_INSTANCE = new SomeClass(5);
  private SomeClass(final int value) {
  }

Die Kennzeichnung als final erspart Ihnen den Ärger, wenn Sie herausfinden, dass es sich tatsächlich um eine final handelt, um dies zu demonstrieren, sehen Sie sich diese Klasse Test an. sieht auf den ersten Blick öffentlich aus.

public class Test{
  private Test(Class beanClass, Class stopClass, int flags)
    throws Exception{
    //  . . . snip . . . 
  }
}

Da der einzige Konstruktor der Klasse privat ist, ist es leider unmöglich, diese Klasse zu erweitern. Im Falle der Klasse Test gibt es keinen Grund, warum die Klasse final sein sollte. Die Klasse Test ist ein gutes Beispiel dafür, wie implizite finale Klassen Probleme verursachen können.

Sie sollten es also als final markieren, wenn Sie eine Klasse implizit final machen, indem Sie ihren Konstruktor privat machen.

5voto

Esko Punkte 28242

Wenn die Klasse markiert ist final bedeutet dies, dass die Struktur der Klasse nicht von außen verändert werden kann. Am deutlichsten wird dies bei der traditionellen polymorphen Vererbung, also class B extends A funktioniert einfach nicht. Es ist im Grunde eine Möglichkeit, einige Teile des Codes zu schützen (zum Umfang) .

Zur Verdeutlichung: Kennzeichnung der Klasse final kennzeichnet seine Felder nicht als final und schützt somit nicht die Objekteigenschaften, sondern die eigentliche Klassenstruktur.

4voto

Rahul Punkte 870

Ein Vorteil, eine Klasse als endgültig zu betrachten :-

Die String-Klasse ist final gehalten, damit niemand ihre Methoden überschreiben und die Funktionalität ändern kann. z.B. kann niemand die Funktionalität der length()-Methode ändern. Sie wird immer die Länge eines Strings zurückgeben.

Der Entwickler dieser Klasse wollte nicht, dass jemand die Funktionalität dieser Klasse ändert, deshalb hat er sie als endgültig festgelegt.

3voto

Raedwald Punkte 43209

Die anderen Antworten konzentrierten sich darauf, was final class sagt dem Compiler, dass er nicht von einer anderen Klasse deklariert werden darf extends dieser Klasse und warum dies wünschenswert ist.

Aber der Compiler ist nicht der einzige Leser des Satzes final class . Jede Programmierer wer den Quellcode liest, liest auch das. Das kann zum schnellen Verständnis des Programms beitragen.

Im Allgemeinen, wenn ein Programmierer sieht Thing thing = that.someMethod(...); und der Programmierer möchte das spätere Verhalten des Objekts verstehen, auf das über die thing Objektreferenz, muss der Programmierer die Thing Klassenhierarchie: potenziell viele Typen, die über viele Pakete verstreut sind. Aber wenn der Programmierer weiß, oder liest, final class Thing wissen sie sofort, dass sie nicht so viele Java-Dateien suchen und studieren müssen, weil es keine abgeleiteten Klassen gibt: Sie müssen nur die Thing.java und vielleicht auch seine Basisklassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X