2016-04-17 8 views
1

Gibt es eine Möglichkeit, die Verwendung von @Override Annotation zu erzwingen?Kann ich die explizite Verwendung von @Override erzwingen?

Nur um zu klären, ich frage nicht: „Wie kann ich eine Unterklasse zwingen, eine Methode zu implementieren“ (wie this):

public abstract class BaseClass { 
    public abstract void foo(); 
} 

Ich frage zu diesem Szenario speziell:

public class AnnotatedSubclass extends BaseClass { 
    @Override 
    public void foo() { 
     System.out.println("I have @Override."); 
    } 
} 

public class NonAnnotatedSubclass extends BaseClass { 
    public void foo() { 
     System.out.println("I do not have @Override."); 
    } 
} 

Beachten Sie, dass beide kompilieren, obwohl NonAnnotatedSubclass keine explizite @Override Annotation hat. Gibt es eine Möglichkeit, dass der Compiler im Fall von NonAnnotatedSubclass einen Fehler/eine Warnung auslöst?

Ich frage, weil manchmal, wenn ich Klassen erweitern versehentlich überschreiben Elternmethoden, weil sie Namen ähnlich denen haben, die ich erstellen würde (wie .paint() in Swing).

+1

Ihre IDE kann Ihnen sagen, wenn dies passiert und automatisch alle Methoden, die '@ Überschreiben, aber nicht. –

+1

"'bezieht sich nicht auf abstrakte Methoden" Oh, aber Sie sollten sein, wenn es eine Methode in 'BaseClass' überschreibt. –

+0

[Googles errorprone] (http://errorprone.info/bugpattern/MissingOverride) hat eine Überprüfung, um diese zur Kompilierzeit zu benötigen. –

Antwort

2

Der Java-Compiler erzwingt nicht ausdrücklich die Verwendung von @Override-Annotation. Zu diesem Zweck würde die Rückwärtskompatibilität mit Code vor Java5 aufgehoben.

Statische Analysewerkzeuge können jedoch genau die Art von Dingen erzwingen, die Sie wollen. Ich verwende meistens checkstyle, um die Verwendung von @Override zu erzwingen. Es hat eine explizite rule für die Verwendung von @Override und es kann in alle gängigen Java-Build-Tools integriert werden - Maven, Gradle, etc.

+0

Vielen Dank! Ich wusste nicht, dass @Override nicht in allen Versionen von Java war (was erklärt, warum es eine optionale Annotation ist). –

+0

Es sieht so aus, als ob checkstyle die Verwendung von '@ Override' nur erzwingen kann, wenn javadoc mit' {@inheritDoc} 'überschrieben wird Etikett :( – fRoStBiT

Verwandte Themen