如何定义强制IDE显示“未声明”警告的界面?

时间:2012-02-02 09:50:40

标签: java interface warnings serializable

当您为类实现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;
}

5 个答案:

答案 0 :(得分:3)

这种特殊情况仅适用于实现Serializable接口并可在eclipse中配置的类。 Windows--->Preference--->Compile--Error/warnings-->Potential programming problems--->这是eclipse配置的地方。即使您强制IDE通过其他方式为您的类显示警告,当您使用javac进行编译时,它也不会强制执行。

答案 1 :(得分:3)

您可以使用aspectj生成编译器警告或错误。它有时用于强制执行架构方面,但也可能适用于您。

Pointcut定义本身留作读者的练习: - )

@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(面向方面​​编程)

答案 2 :(得分:2)

这与你正在使用的IDE没有任何关系,它与你声明你的界面错误有关。您的界面必须包含方法签名,现在在您的示例中它只包含常量的声明。为了使您的界面有效,它需要看起来更像这样:

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

如果在接口中声明任何类型的变量(如上所述),则假定它是静态的和最终的,也称为实现接口的类无法更改的常量。

希望有所帮助! 大卫

答案 3 :(得分:1)

通常,Java中的接口无法实现这一点。

如果您希望该字段可公开访问,那么您应该为它提供getter和setter方法。您可以在接口中声明这些方法,如果实现类没有声明它们,这当然会导致编译器错误。

如果你只想强制这些类有一个私有字段,你可以在某些时候通过反射访问它,你应该考虑是否有另一个解决方案不需要该字段。也许它也可以使用方法?

最后一个选项是使用FindBugs之类的静态分析工具,它允许您定义custom bug patterns。因此,您可以编写一个规则来查找没有此字段的接口的实现者,并在FindBugs配置中启用它。 FindBugs有一个很好的Eclipse插件,可以在代码中显示FindBugs警告(就像常规Eclipse警告一样)。

答案 4 :(得分:1)

IDE不是提出警告的人。它是编译器。如果需要自定义警告,则需要自定义编译器。但是你应该用你的界面分发编译器。

为了创建自定义编译器,您可以使用:
http://today.java.net/article/2008/04/09/source-code-analysis-using-java-6-apis

基本上,您需要定义自己的注释和注释处理器。您可能会为您的界面创建一个注释,当一个类实现它并且它没有定义变量时,您将发出警告。
我还没有这样做,所以我不能给你更多关于它的信息。

另一种可能性是使用现有的编译器插件来定义自定义警告和注释: https://checkerframework.org/
我不知道它是否会帮助你完成任务,或者你最终应该编写自己的编译器插件。

PS:结帐这篇文章也是:
How to intentionally cause a custom java compiler warning message?