Frage

Wenn eine Klasse eine Anmerkung definiert, ist es irgendwie möglich, seine Unterklasse zu zwingen, die gleiche Anmerkung zu definieren?

Zum Beispiel haben wir ein einfache Klasse / Unterklasse-Paar, das den @Author @interface. teilen Was würde Ich mag zu tun, jede weitere Unterklasse zwingen, die gleiche @Author Anmerkung, verhindert eine RuntimeException irgendwo auf dem Weg zu definieren.

TestClass.java:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@interface Author { String name(); }

@Author( name = "foo" )
public abstract class TestClass
{
    public static String getInfo( Class<? extends TestClass> c )
    {
        return c.getAnnotation( Author.class ).name();
    }

    public static void main( String[] args )
    {
        System.out.println( "The test class was written by "
                        + getInfo( TestClass.class ) );
        System.out.println( "The test subclass was written by " 
                        + getInfo( TestSubClass.class ) );
    }
}

TestSubClass.java:

@Author( name = "bar" )
public abstract class TestSubClass extends TestClass {}

Ich weiß, ich kann alle Anmerkungen zur Laufzeit aufzählen und für den fehlenden @Author überprüfen, aber ich würde die wirklich gerne bei der Kompilierung tun, wenn möglich.

War es hilfreich?

Andere Tipps

Ich bin ziemlich sicher, dass dies nicht möglich ist, bei der Kompilierung zu tun.

Dies ist jedoch offensichtlich, dass die Aufgabe für eine „Einheit“ -Test. Wenn Sie Konventionen wie diese haben, die Sie durchgesetzt würden, aber die schwierig oder unmöglich sein, können mit dem Compiler zu überprüfen, „Einheit“ -Tests ist eine einfache Möglichkeit, um sie zu überprüfen.

Eine andere Möglichkeit ist eine benutzerdefinierte Regel in einem statischen Analysegerät zu implementieren. Es gibt viele Optionen auch hier.

(Ich habe Einheit in Schrecken Anführungszeichen, da dies wirklich ein Test der Konventionen ist, anstatt eine bestimmte Einheit. Aber es sollte mit dem Gerät-Tests läuft zusammen).

Sie können eine Annotation (z @EnforceAuthor) mit @Inherited machen auf den übergeordneten Klasse und Verwendung Compiler Anmerkungen (seit Java 1.6) bei der Kompilierung, um aufzuholen. Dann haben Sie einen Verweis auf die Unterklasse und können prüfen, ob eine andere Anmerkung (z @Author)) fehlt. Dies würde es ermöglichen mit einer Fehlermeldung abbrechen kompilieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top