繁体   English   中英

Java /静态模拟中的静态调用中的对象

[英]Objects made in static calls in java/static mocking

说我在Java中有一个静态方法。 我将静态方法包装在这样的方法中,因此我可以通过模拟新的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);
    }

}

在阅读了静态模拟框架的工作原理之后,我对框架为了模拟响应而操纵字节码的想法并不感到兴奋,这有点hack和斜线。

那和静态调用在正确使用时很有用(就像有用的东西一样),但是说我正在重构一个有静态调用的旧版应用程序,无论我是否喜欢它都必须处理它们,我想静态调用像上面一样是可模拟的,例如,由于时间限制,我无法更改静态方法。

我的主要问题:因此,将以静态方法创建对象:永远不会在返回结果后使用它。 怎么了? 我是否需要担心效率问题?

其他内容:帮我解决我在这里所说的任何事情,或者如果该方法已记录在某处,请告诉我,因为我不想毒害我的代码库,我一无所知。

我的主要问题:因此,将以静态方法创建对象:永远不会在返回结果后使用它。 怎么了? 我是否需要担心效率问题?

如果没有对该对象的引用,那么它将在将来的某个时刻由GC释放。 在现代平台上,此操作的开销非常低,分配的成本通常只是线程局部指针的颠簸以及对象初始化/构造函数的成本。 GC的成本是免费的,因为GC的成本与堆中有多少可访问对象有关。 该对象将无法到达,因此不会产生GC成本。 我应该注意,我假设该对象没有析构函数方法。 如果这样做的话,那将是有代价的; 但是这些天是谁使用的? 如果对对象的引用的生存时间足以使GC发生,那么代价就是检测对象可到达并在幸存者空间之间复制对象所花费的时间。 对于任何正常大小的物体,将以微秒为单位进行测量; BIG对象(例如大型数组)可能需要更长的时间才能复制。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM