如何防止类编译

时间:2013-06-25 14:26:51

标签: java

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

3 个答案:

答案 0 :(得分:5)

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

通常这样做的方法是让你在进行构建时执行单元测试(无论如何都没有人在真实项目中编译“手动”)。

在测试失败时使构建中断错误是一种非常常见的情况。

答案 1 :(得分:2)

  1. 您描述的情况通过单元测试解决。单元测试可以防止您的代码被构建或交付,但当然它无法阻止它被编译,因为它需要编译代码才能工作。这些非常容易设置并绑定到Maven中的构建,也可以在Ant中使用。

  2. 据我所知,面向方面的编程可以增加编译时间限制。我在this answer here中简要介绍了这个问题。编译时约束。类比,如果AOP可以强制执行包依赖,也许它可以强制类Foo依赖于类Bar,这是你的情况 - 但我实际上并不知道AOP,所以很开心研究。

  3. 同样,对于更简单的情况,您实际上只需添加预编译步骤,即使使用C预处理器和#error宏也是如此。但这部分是AOP的原因。

  4. 您可以添加静态断言,以便该类在加载时失败,该加载时超过运行时(排序)但晚于编译时。加载时间的改善。同样,单元测试是如何解决这个问题的。

  5. 如上所述,使用纯Java的运行时计算不会导致编译时失败。

答案 2 :(得分:1)

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

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

在Scala之类的语言中,您可以在类型系统中对所需的不变量进行编码,在这种情况下,编译器能够检查特定的子班级服从合同。