如何防止类编译

4

我想知道是否有可能在特定条件下阻止我的Java应用程序编译,并以某种方式抛出编译错误。(在我的情况下,我想检查特定包中的哈希码实现是否返回唯一值,以进行缓存)我知道可以使用反射编写Maven插件来实现,但不幸的是这对我来说不是一个解决方案。


当你说“编译”时,你真的是指构建吗?如果你不能使用Maven,还有其他构建、单元测试或静态分析工具可以帮助你。请参阅JUnit、Ant、Gradle、https://dev59.com/BHVD5IYBdhLWcg3wXaYd和https://dev59.com/qmjWa4cB1Zd3GeqPp1xJ。 - Will
你是在编译时进行运行时检查吗? - Mehdi Karamosly
你可以为此编写测试。你可以配置你的IDE始终运行某种类型的测试。然后,你可以配置你的持续集成环境,如果某些测试未满足,则不部署。 - Damian Leszczyński - Vash
我猜你正在寻找类似于C++中的模板元编程的东西? - Raedwald
3个回答

5

不,你不能在编译期间进行此类检查(假设使用javac进行正常编译)。

通常的方法是拥有单元测试,在每次构建时执行它们(无论如何,在真实项目中没有人会进行“手动”编译)。

当测试失败时,构建会因错误而中断,这是非常常见的情况。


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

  2. 据我所知,面向方面的编程可以添加编译时约束。这在这个答案中简要介绍了一下,是我针对Java问题提出的关于编译时约束的问题。类比一下,如果AOP可以强制执行包依赖关系,那么它可能会强制执行Foo类依赖于Bar类,这就是您的情况,但我实际上不了解AOP,所以请自行研究。

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

  4. 您可以添加静态断言,以便在加载时该类失败,这比运行时(有点)更早,但比编译时晚。这是优于加载时间的改进。同样,单元测试是实际解决此问题的方法。

  5. 如描述的那样,您无法通过使用纯Java的运行时计算来导致编译时失败。


AOP似乎是在这种情况下最好的选择,谢谢你的帮助 :) - kookee
@kookee 不是这样的。单元测试和“非手动”构建才是。 - djechlin
问题在于我将把它用作外部库,因此它必须独立于非手动构建/单元测试。好吧,如果方面不起作用,人们将需要考虑编写他们的哈希码 :) 无论如何,谢谢。 - kookee
@kookee 但是...但是...使用真正的构建和发布的重点在于您可以将其用作外部库。您将其构建、打包和测试为内部库,然后将其作为jar文件包含在可执行文件的类路径中。这就是它的工作原理。 - djechlin
是的,但是带有哈希码的bean将在库之外(在项目中),我希望可以将bean包传递给库中某种处理程序的实现,从而防止整个编译过程... - kookee

1

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接