10 Stimmen

Warum kann eine Java-Klasse nicht sowohl abstrakt als auch final sein?

Angenommen, ich habe eine Hilfsklasse, die nur statische Methoden und Variablen enthält. z.B.:

public abstract final class StringUtils
{
    public static final String NEW_LINE = System.getProperty("line.separator");

    public static boolean isNotNullOrSpace(final String string)
    {
        return !(string == null || string.length() < 1 || string.trim().length() < 1);
    }
}

In diesem Szenario macht es Sinn, die Klasse sowohl abstrakt als auch final zu machen. Abstrakt, weil es keinen Nutzen macht, ein Objekt dieser Klasse zu erstellen, da alle Methoden statisch zugänglich sind. Final, weil die abgeleitete Klasse nichts von dieser Klasse erben kann, da sie kein nicht-statiges Element hat.

C# erlaubt den static Modifizierer für solche Klassen. Warum unterstützt Java das nicht?

19voto

Joe Lee-Moyet Punkte 1655

Es ist nicht möglich, weil die Java-Sprachspezifikation besagt, dass:

Es ist ein Kompilierungsfehler, eine abstrakte Klassentyp zu deklarieren, so dass es nicht möglich ist, eine Unterklasse zu erstellen, die alle ihre abstrakten Methoden implementiert [1]

Jenseits dessen gibt es keinen inhärenten Grund, warum eine abstrakte finale Klasse unlogisch wäre - das Wort abstract wird im Allgemeinen im Gegensatz zu concrete verwendet, um zu bedeuten, dass keine direkten Instanzen eines Typs existieren können.

13voto

ssantos Punkte 15781

Eine final-Klasse kann nicht erweitert werden, eine abstract-Klasse muss erweitert werden, um instanziiert zu werden. Daher wäre eine final abstract-Klasse ein logischer Widerspruch.

Wenn Ihre Klasse nur static-Methoden hat, sollten Sie vielleicht einfach ihren Konstruktor verbergen, indem Sie ihn als private definieren.

private StringUtils() {
}

1voto

user1515520 Punkte 624

Es gibt keinen Grund außer der Subjektivität, aber Sie können das gleiche Ziel erreichen, indem Sie Ihre Klasse abstrakt machen und alle Ihre Methoden final machen. Wie:

public abstract class MyClass {
    …
    public final static void myMethod1() {
        …
    }

    public final static void myMethod2() {
        …
    }
}

Der Compiler wird dies überprüfen und einen Fehler melden, wenn Sie versuchen, ein Objekt von MyClass zu instanziieren, und es wird auch nicht möglich sein, die finalen Methoden zu überschreiben, wenn eine Unterklasse MyClass erweitert.

0voto

Aufgrund einiger bestimmter Gründe können wir das Schlüsselwort final nicht mit einer abstrakten Klasse verwenden.

  1. Wenn wir abstract final definieren, können wir sie nicht erweitern.
  2. Abstrakte Klasse soll von anderen Klassen geerbt werden und die Implementierung von nicht konkreten Methoden bereitstellen.
  3. Wenn wir eine abstrakte Klasse als final definieren, wird ein Kompilierfehler aufgetreten.

0voto

Wenn wir eine Klasse als abstrakt deklarieren, kann sie nicht instantiiert werden. Wenn wir eine Klasse als final deklarieren, kann sie nicht geerbt werden. Um die Methoden in der abstrakten Klasse zu implementieren, muss die Klasse geerbt werden. Aber wenn wir eine Klasse als final deklarieren, kann sie nicht geerbt werden. Daher können wir eine Klasse nicht gleichzeitig als sowohl abstrakt als auch final deklarieren

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