1

今天,我需要确保仅使用核心 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会更好。

4

1 回答 1

1

如果数据中心的某个人(无论出于何种原因)启用了断言,那么您的生产将在生产环境中愉快地执行测试代码:例如,如果管理员启用断言来分析另一个应用程序,但他只是在他的安慰。或者只能全局启用它们。这只是发生。

而且你不能真的责怪他:基本问题确实是“断言”和“有条件地执行生产或测试代码”之间的联系并不明显。

于 2013-07-26T15:06:39.240 回答