4

我只是想知道如果某些条件被破坏并且只是以某种方式抛出编译错误,是否有可能阻止我的 Java 应用程序编译。(在我的情况下,我想检查某些包中的哈希码实现是否返回唯一值,以用于缓存目的)我知道可以通过使用反射编写 maven 插件,但不幸的是它不是我的解决方案。

4

3 回答 3

5

不,您不能在编译期间进行这样的检查(假设使用 正常编译javac)。

执行此操作的常用方法是在构建时执行单元测试(无论如何,没有人真正在实际项目中进行“手动”编译)。

当测试失败时,构建中断并出现错误是一种非常常见的情况。

于 2013-06-25T14:29:25.347 回答
2
  1. 您描述的情况是通过单元测试解决的。单元测试可以阻止您的代码被构建或交付,但它当然不能阻止它被编译,因为它需要编译后的代码才能工作。这些在 Maven 中很容易设置和绑定到构建,在 Ant 中也是可能的。

  2. 据我所知,面向方面的编程可以增加编译时间限制。对于我问过的一个 Java 问题,这里的答案简要介绍了这一点。编译时约束。类比,如果 AOP 可以强制执行包依赖,也许它可以强制 classFoo依赖 class Bar,这是你的情况 - 但我实际上并不了解 AOP,所以很高兴研究。

  3. 同样,对于更简单的情况,您实际上可以只添加一个预编译步骤,甚至使用 C 预处理器和#error宏。但这部分是 AOP。

  4. 您可以添加静态断言,以便类在加载时失败,这在运行时(某种意义上)之前但在编译时之后。加载时间的改进。同样,单元测试是实际解决这个问题的方法。

  5. 如前所述,您不能通过使用纯 Java 的运行时计算导致编译时失败。

于 2013-06-25T14:31:07.593 回答
1

您将需要一个支持检查要保留的不变量的编译器;也许是一个可扩展的编译器,例如JastAddJ

大多数项目要么依赖单元测试来检查行为,要么依赖于编译后使用findbugsCoverity等工具进行静态分析。

有可能在像 Scala 这样的语言中,您可以在类型系统中编码您想要的不变量,在这种情况下,编译器能够检查特定的子类是否遵守合同。

于 2013-06-25T14:34:12.467 回答