2008-09-18 106 views
11

如果一個類定義了一個註釋,是否有可能迫使它的子類定義相同的註釋?如何強制Java子類定義註釋?

例如,我們有一個簡單的類/子對共享@Author @interface. 我想要做的是強制每個子類進一步定義相同@Author標註,防止RuntimeException某處的道路。

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 {} 

我知道我可以在運行時枚舉所有註釋和檢查失蹤@Author,但我真的很喜歡做的事這在編譯時,如果可能的話。

回答

3

我確定在編譯時這是不可能的。

但是,這是「單元」測試的一項顯而易見的任務。如果你有這樣的習慣,你想強制執行,但是編譯器很難或不可能檢查,「單元」測試是檢查它們的簡單方法。

另一種可能性是在靜態分析器中實現自定義規則。這裏也有很多選擇。 (我把單位放在嚇人的引號中,因爲這實際上是對慣例的測試,而不是特定的單位,但它應該與你的單元測試一起運行)。

2

您可以在超類上使用@Inherited創建Annotation(例如@EnforceAuthor),並使用編譯器註釋(自Java 1.6以來)在編譯時趕上。然後你有一個子類的引用,並可以檢查是否缺少另一個Annotation(例如@Author))。這將允許取消編譯錯誤消息。