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