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?

2voto

Kingz Punkte 4576

Betrachten Sie FINAL als das "Ende der Fahnenstange" - der Mann kann keine Nachkommen mehr zeugen. Wenn Sie das so sehen, werden Sie in der realen Welt auf eine Menge Szenarien stoßen, die es erforderlich machen, dass Sie der Klasse eine Markierung für das "Ende der Linie" geben. Das ist Domain Driven Design - wenn Ihre Domain verlangt, dass eine bestimmte ENTITÄT (Klasse) keine Unterklassen erzeugen kann, dann markieren Sie sie als FINAL.

Ich sollte anmerken, dass Sie nichts daran hindert, eine Klasse mit der Kennzeichnung "should be tagged as final" zu erben. Dies wird jedoch im Allgemeinen als "Missbrauch der Vererbung" eingestuft und geschieht, weil man in den meisten Fällen eine Funktion von der Basisklasse in seine Klasse erben möchte.

Die beste Herangehensweise besteht darin, den Bereich zu betrachten und sich von ihm die Designentscheidungen diktieren zu lassen.

2voto

Andy Punkte 3851

Angenommen, Sie haben eine Employee Klasse, die eine Methode hat greet . Wenn die greet Methode aufgerufen wird, wird einfach gedruckt Hello everyone! . Das ist also die erwartetes Verhalten von greet Methode

public class Employee {

    void greet() {
        System.out.println("Hello everyone!");
    }
}

Nun, lassen Sie GrumpyEmployee subclase Employee und außer Kraft setzen greet Methode wie unten dargestellt.

public class GrumpyEmployee extends Employee {

    @Override
    void greet() {
        System.out.println("Get lost!");
    }
}

Schauen Sie sich nun im folgenden Code die sayHello Methode. Sie dauert Employee Instanz als Parameter und ruft die greet-Methode auf, in der Hoffnung, dass sie sagen würde Hello everyone! Aber was wir bekommen, ist Get lost! . Diese Verhaltensänderung ist auf Folgendes zurückzuführen Employee grumpyEmployee = new GrumpyEmployee();

public class TestFinal {
    static Employee grumpyEmployee = new GrumpyEmployee();

    public static void main(String[] args) {
        TestFinal testFinal = new TestFinal();
        testFinal.sayHello(grumpyEmployee);
    }

    private void sayHello(Employee employee) {
        employee.greet(); //Here you would expect a warm greeting, but what you get is "Get lost!"
    }
}

Diese Situation kann sein vermieden wenn die Employee Klasse gemacht wurde final . Stellen Sie sich vor, was für ein Chaos ein frecher Programmierer verursachen könnte, wenn String Klasse wurde nicht deklariert als final .

2voto

James Punkte 8887

Ja, manchmal ist dies aus Sicherheits- oder Geschwindigkeitsgründen erforderlich. Es wird auch in C++ gemacht. Es muss nicht sein dass für Programme, aber mehr noch für Rahmenwerke. http://www.glenmccl.com/perfj_025.htm

1voto

lok Punkte 11

Wie oben gesagt, wenn Sie wollen, dass niemand die Funktionalität der Methode ändern kann, können Sie sie als final deklarieren.

Beispiel: Anwendungsserver-Dateipfad für Download/Upload, Aufteilung der Zeichenkette anhand des Offsets, solche Methoden können Sie als endgültig deklarieren, damit diese Methodenfunktionen nicht geändert werden. Und wenn Sie solche finalen Methoden in einer separaten Klasse haben wollen, dann definieren Sie diese Klasse als Final-Klasse. Die Klasse Final enthält dann alle finalen Methoden, während die finale Methode in einer nicht-finalen Klasse deklariert und definiert werden kann.

1voto

G. Raven Punkte 77

Die letzte Klasse kann nicht weiter verlängert werden. Wenn wir eine Klasse in Java nicht vererbbar machen müssen, können wir diesen Ansatz verwenden.

Wenn wir nur bestimmte Methoden in einer Klasse nicht überschreiben wollen, können wir ihnen einfach das Schlüsselwort final voranstellen. Die Klasse ist dann immer noch vererbbar.

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