【问题标题】:How can I define an interface that forces the IDE to show "not declared" warning?如何定义强制 IDE 显示“未声明”警告的接口?
【发布时间】:2012-02-02 09:50:40
【问题描述】:

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

【问题讨论】:

  • 您是否在寻找 java 注释以引起警告?

标签: java interface warnings serializable


【解决方案1】:

您可以使用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(面向方面​​的编程)

【讨论】:

  • 我正在使用您的代码并得到错误:“切入点无法解析为类型”。这意味着没有定义切入点类或接口。你能解释一下你的例子吗?
  • 导入 org.aspectj.lang.annotation.*
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    如果您在接口中声明任何类型的变量,例如您在上面所做的,则假定它是静态的和最终的,也称为不能被实现该接口的类更改的常量。

    希望对您有所帮助! 大卫

    【讨论】:

      【解决方案4】:

      一般来说,Java 中的接口无法做到这一点。

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

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

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

      【讨论】:

        【解决方案5】:

        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?

        【讨论】:

          猜你喜欢
          • 2017-07-25
          • 1970-01-01
          • 2022-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多