我想知道是否有可能在特定条件下阻止我的Java应用程序编译,并以某种方式抛出编译错误。(在我的情况下,我想检查特定包中的哈希码实现是否返回唯一值,以进行缓存)我知道可以使用反射编写Maven插件来实现,但不幸的是这对我来说不是一个解决方案。
我想知道是否有可能在特定条件下阻止我的Java应用程序编译,并以某种方式抛出编译错误。(在我的情况下,我想检查特定包中的哈希码实现是否返回唯一值,以进行缓存)我知道可以使用反射编写Maven插件来实现,但不幸的是这对我来说不是一个解决方案。
不,你不能在编译期间进行此类检查(假设使用javac
进行正常编译)。
通常的方法是拥有单元测试,在每次构建时执行它们(无论如何,在真实项目中没有人会进行“手动”编译)。
当测试失败时,构建会因错误而中断,这是非常常见的情况。
您描述的情况可以通过单元测试解决。单元测试可以防止您的代码构建或交付,但当然它无法阻止编译,因为需要编译后的代码才能运行。这些非常容易设置并与Maven绑定构建,也可以在Ant中实现。
据我所知,面向方面的编程可以添加编译时约束。这在这个答案中简要介绍了一下,是我针对Java问题提出的关于编译时约束的问题。类比一下,如果AOP可以强制执行包依赖关系,那么它可能会强制执行Foo类依赖于Bar类,这就是您的情况,但我实际上不了解AOP,所以请自行研究。
同样,对于更简单的情况,您实际上可以添加一个预编译步骤,甚至使用C预处理器和#error宏。但这在某种程度上就是AOP。
您可以添加静态断言,以便在加载时该类失败,这比运行时(有点)更早,但比编译时晚。这是优于加载时间的改进。同样,单元测试是实际解决此问题的方法。
如描述的那样,您无法通过使用纯Java的运行时计算来导致编译时失败。