【发布时间】:2012-10-19 19:51:11
【问题描述】:
我正在开发一个编程游戏,玩家可以在其中访问一个抽象类并对其进行扩展以控制机器人的行为。因为它是一个编程游戏,所以我试图保护我的游戏基础设施,这样玩家就不会弄乱游戏,而不仅仅是我给他们的课程;为此,我制作了大部分课程final,但现在我无法在单元测试中模拟它们(mockito + testNG)。
所以我想知道,我该如何解决这个问题?有没有办法让类非最终测试,然后在构建周期的后期以某种方式自动“final-ize”它们(我正在使用 maven,以防它与答案相关)。我不想添加另一个外部库或更改我的模拟库。
如果不可能,那么第二个问题:让一个类final 真的安全吗? 我看到一些库可以从字节码中删除final 分类器,这让我觉得可能是@如果 987654325@ 可以从已经编译的类中删除,则它是无用的
【问题讨论】:
-
我建议使用接口而不是类。并使用 DI。
-
一旦你的代码在他们的机器上运行,就不可能防止人们弄乱你的代码。这在某种程度上适用于所有程序,但更适用于 java 程序,因为 java 类很容易反编译。无论您做什么,他们都可以简单地反编译、修改和重新编译您的代码,从而改变其行为。
-
包含
final是Java 编程语言最糟糕的设计决策之一。我敢于向我展示一个实际增加价值的有效用法的好例子,我会很高兴地用大约 100 个例子来反驳它,这些例子除了增加挫败感、不灵活和代码重复之外什么也没有。如果 Oracle 完全放弃final,我会是一个快乐的开发者。 -
关于你的第二个问题:使用
final是OO设计的问题,也是一种帮助静态分析工具帮助我们编写更好代码的方法,而不是让代码“安全”的方法。final或有关字节码的任何其他内容是否可以在运行时修改通常无关紧要;一个安全的环境需要一个沙箱,Java 通过SecurityManager支持它,但这通常只用于小程序和托管 Java EE 容器中。
标签: java unit-testing maven mocking mockito