在java / static mocking中的静态调用中生成的对象

时间:2014-09-06 09:37:00

标签: java unit-testing oop static mocking

假设我在java中有一个静态方法。 我将静态方法包装在这样的方法中,所以我可以“模拟”#39;通过模拟新的getInterestingString方法进行测试的静态方法:

Class AClass{

    private static String getStaticString(int parameter){
        Something something = new Something(parameter);
        return something.doSomethingThatReturnsAString();

    }

    public String getInterestingString(int parameter){
        AClass.getStaticString(parameter);
    }

}

在阅读静态模拟框架如何工作之后,我对框架操纵字节代码以模拟其响应的想法并不感到兴奋,这有点破解和削减。

那,静态调用在正确使用时非常有用(比如任何有用的东西),但是我说我正在重构一个静态调用的遗留应用程序,无论我喜欢与否,我都要处理它们,我想要使静态调用像上面那样可以模拟,但由于时间限制,我无法改变静态方法。

我的主要问题: 因此,对象在静态方法中创建:在返回结果之后,它不再需要。怎么了?我需要担心效率吗?

其他东西: 帮助我解决我在这里所说的任何事情,或者如果这个方法已经记录在某处让我知道,因为我不想毒害我的代码库而且我什么都不知道。

1 个答案:

答案 0 :(得分:1)

  

我的主要问题:所以在静态方法中创建一个对象:在返回结果之后不需要它。怎么了?我需要担心效率吗?

如果没有对该对象的引用,那么它将在未来某个时候由GC发布。现代平台上的开销非常低,分配的成本通常只是线程本地指针的一个凸起以及对象初始化/构造函数的成本。 GC的成本是免费的,因为GC的成本与堆上可达对象的数量有关。此对象将无法访问,因此不会产生GC成本。我应该注意到我假设对象没有析构函数方法;如果它确实那么会有成本;但这几天谁使用那些?如果对对象的引用确实存在足够长的时间以便GC发生,则成本将是检测对象可到达并在幸存者空间之间复制对象所花费的时间。对于任何正常大小的对象,将以微秒为单位进行测量; BIG对象,例如大型数组,可能需要更长时间才能复制。

在正常应用中,这个小成本无需担心。然而,如果它出现在具有数百万次迭代的循环中,这在金融或科学计算中并不罕见,那么成本将被放大,并且会冒高GC负担的风险。在极低延迟的应用程序中,必须避免GC暂停,因此分配对象的任何内容都有可能将时间移到下一个GC暂停更近,因此应避免。但是对于所有其他应用程序和单元测试,则不必担心低微秒成本。只需打印到stdout就会花费更多。