今天,我需要确保仅使用核心 Java(没有 AspectJ)从生产环境中删除一些代码部分。经过一番思考,我意识到我可以做以下事情,除了完全滥用合同断言的概念之外,任何人都可以提出可能出现的实际问题吗?
public class ProductionVerifier {
static boolean isTest;
static {
// This will set isTest to true if run with -ea, otherwise
// the following line will be removed and isTest will be false.
assert isTest=true;
}
public static final boolean TEST = isTest;
public static final void runOnlyIfInTest(Runnable runable) {
// javac will remove the following section if TEST == false
if (TEST) {
runable.run();
}
}
}
import static ProductionVerifier.*;
public class DemonstrationClass {
private static Runnable notForClient = new Runnable() {
public void run(){System.out.println("h4x0r");}
};
public static void main (String[] args) {
runOnlyIfInTest(notForClient);
}
}
我最初主要担心的是测试代码的范围允许从生产环境访问它,但我认为即使我将每组测试语句包装在 if (TEST) 块中,该模式也可能存在一些更基本的问题.
编辑:从答案和链接的问题中得出结论,存在维护/设计问题,即启用断言现在会改变系统任意位的行为,以及技术问题,即这些语句中的代码实际上并没有从类文件中删除,因为 TEST 不是编译时间常数。这些问题可以通过删除断言黑客来解决,尽管重构不需要的代码ProductionVerifier
会更好。