2014-09-06 12 views
0

说我在java中有一个静态方法。 我换静态方法在这样的方法,这样我就可以“模拟”通过嘲讽新getInterestingString方法测试静态方法:java/static mocking中的静态调用中产生的对象

Class AClass{ 

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

    } 

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

} 

阅读嘲弄框架是如何静下班后,我没有真正高兴与框架的想法操纵字节代码,以嘲笑他们的回应,这有点黑客和斜杠。

这样,静态调用在正确使用时很有用(比如任何有用的东西),但是我说我正在重构一个传统应用程序,其中存在静态调用,我必须处理它们,不管我喜不喜欢,还是我想要像上面那样进行静态调用,并且由于时间限制,我无法将静态方法更改。

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

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

+0

首先'Class'不是以Java中的大写字母开头,类名称应该但是你有单独的'AClass'和'aClass'引用。 另外,你在问什么?在'static'方法中创建的对象会发生什么? – 2014-09-06 09:40:07

+0

更正,谢谢 – 2014-09-06 09:42:41

回答

1

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

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

在正常的应用中,这个小花费是没有什么可担心的。然而,如果它出现在一个有数百万次迭代的循环中,这在财务或科学计算中并不罕见,那么成本将会被放大,并且可能会导致高GC负担。在非常低延迟的应用程序中,必须避免GC暂停,因此分配对象的任何事物都有可能将时间移到下一个GC更接近的地方,因此应该避免。然而,对于所有其他应用程序和单元测试,则不必担心微秒级的低成本。只是打印到标准输出花费更多。