在以下情况下,性能/可靠性情况如何:
public class A {
private SomeObject a = new SomeObject();
//...
public void method() {
a.callSomeMethod();
}
//...
}
相对:
public class A {
//...
public void method() {
SomeObject a = new SomeObject();
a.callSomeMethod();
}
//...
}
从可测试性的角度来看,我得到的第二个选择不是那么好。但是性能,可靠性如何-您应该走哪条路?要将对象初始化为文件场并大量使用它还是在每次需要时对其进行初始化?
以后编辑:对象的构造不会花费很长时间。该方法被大量使用。
如果要评估两个抽象选项之间的性能差异,请参见此处;最好的方法是夸大一切。例如,假设SomeObject
实例化需要花费大量时间(例如600秒),并且您计划进行method()
大量调用(因为在项目扩展之前通常不会意识到性能问题)。
显而易见,选项1会比多次method()
调用更好地“执行” ,因为每次您要调用方法时,选项2都会导致巨大的操作。(是的,作为粗略的性能测试,您可以通过for循环运行每个选项并比较经过的时间,但是应该很容易看出:其他所有条件都相同,n次创建一个对象比创建一个对象要花费更多的时间一个对象一次)。
但是,夸大示例中的性能本身并不一定是在所有情况下都支持选项1的原因。
确实归结于的体系结构SomeObject
。什么是 SomeObject
?可能SomeObject
是这个对象在你的整个生命中都无法保持开放A
; 例如,可能是某种流读取器在从流中读取资源时锁定了该资源。在这种情况下,您可能不希望一直SomeObject
“打开”阻塞该资源;应将其放置在method()
通话结束时。
是的,但是也许SomeObject
是公开业务逻辑的服务或外观之类的东西。正如您在问题中提到的那样,它是“更好的测试”,完整的答案是,是的,它使依赖注入变得更容易,这是单元测试的关键组成部分。(尽管通常将其重写为private SomeObject a;
,使用类似构造函数的构造函数public a (SomeObject a) { this.a = a; }
来遵循控制范式的依赖项注入/反转。但是,对于此问题,最终结果是相同的。)
对于(精心设计的)服务或实用程序功能,您希望它可以自己(私下)处理对象。这种情况下使用最多的模式是选项1,因为它为您提供了一个管理依赖项的地方,而不是在使用它的每种方法中。
了解上述内容应足以做出明智的决定。
Closable
,比如StreamReader
,FileWriter
等等。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句