簡體   English   中英

如何定義強制IDE顯示“未聲明”警告的接口?

[英]How can I define an interface that forces the IDE to show “not declared” warning?

當為您的類實現Serializable時,IDE會顯示一條警告,指出可序列化的類YOURCLASS沒有聲明類型為long的靜態最終serialVersionUID字段。

如何定義一個強制IDE向我的字段顯示此警告的接口?

public class MyClass implements Serializable 
{
    // this class has warning
}

public class MyClass implements MyInterface
{
    // I want to have warning for this class
}

public interface MyInterface{
    public static final long myField;
}

僅在類實現Serializable接口且可在eclipse中配置的情況下才適用特殊情況。 Windows--->Preference--->Compile--Error/warnings-->Potential programming problems---> eclipse為此配置的地方。 即使您強制IDE通過其他方式為類顯示警告,但使用javac編譯時,它也不會強制執行。

您可以使用aspectj生成編譯器警告或錯誤。 它有時用於強制執行體系結構方面,但也可能適用於您。

切入點定義本身留給讀者練習:-)

@Aspect
public class ArchitecturalEnforcement {
    @Pointcut("...")
    public void implementsInterface() {}

    @Pointcut("...")
    public void definesConstant(){}

    /** Advice that defines an error when a GUI method calls a method in the DAO layer */
    @DeclareWarning("implementsInterface() && !definesConstant()")
    private static final String WARNING= "...";
}

閱讀有關AOP (面向方面​​的編程)的更多信息

這與您使用的IDE沒有任何關系,與您聲明接口錯誤有關。 您的接口必須包含方法簽名,現在在您的示例中,它僅包含一個常量聲明。 為了使您的界面有效,它需要看起來像這樣:

public interface MyInterface{
   public long doSomethingAndReturnALong();
   public void doSomethingElseButRequireAnInt(int var);
}

如果您在接口中聲明了任何種類的變量(如您在上面所做的那樣),則假定該變量是靜態的且是最終變量,也稱為常量,實現該接口的類不能更改該常量。

希望有幫助! 大衛

通常,這對於Java中的接口是不可能的。

如果希望該字段可公開訪問,則無論如何都應提供該方法的getter和setter方法。 您可以在接口中聲明這些方法,如果實現類未聲明它們,則當然會導致編譯器錯誤。

如果只想強制類具有一個私有字段,您可以在某個時候通過反射來訪問該私有字段,則應考慮是否存在另一種不需要該字段的解決方案。 也許也可以使用方法嗎?

最后一個選擇是使用靜態分析工具,例如FindBugs ,它允許您定義自定義的錯誤模式 因此,您將編寫一條規則來查找沒有此字段的接口的實現者,並在FindBugs配置中啟用它。 有一個很好的用於FindBugs的Eclipse插件,該插件在您的代碼中顯示FindBugs警告(就像常規的Eclipse警告一樣)。

IDE並不是發出警告的人。 它是編譯器。 如果需要自定義警告,則需要自定義編譯器。 但是隨后您應該使用接口分發編譯器。

為了創建自定義編譯器,您可以使用:
http://today.java.net/article/2008/04/09/source-code-analysis-using-java-6-apis

基本上,您需要定義自己的注釋和注釋處理器。 可能會為您的接口創建一個注釋,當類實現該注釋且未定義變量時,您將發出警告。
我尚未執行此操作,因此無法向您提供更多信息。

另一種可能性是使用定義了自定義警告和注釋的現有編譯器插件: https : //checkerframework.org/
我不知道它是否會幫助您完成任務,還是您最終應該編寫自己的編譯器插件。

PS:也查看此帖子:
如何故意導致自定義Java編譯器警告消息?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM