如何使用字段或局部变量初始化Java中的对象?

x烷

在以下情况下,性能/可靠性情况如何:

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();
    }

    //...
}

从可测试性的角度来看,我得到的第二个选择不是那么好。但是性能,可靠性如何-您应该走哪条路?要将对象初始化为文件场并大量使用它还是在每次需要时对其进行初始化?

以后编辑:对象的构造不会花费很长时间。该方法被大量使用。

亚伦·布伦库什(Aaron Blenkush)

这取决于。

表现

如果要评估两个抽象选项之间的性能差异,请参见此处;最好的方法是夸大一切。例如,假设SomeObject实例化需要花费大量时间(例如600秒),并且您计划进行method()大量调用(因为在项目扩展之前通常不会意识到性能问题)。

显而易见,选项1会比多次method()调用更好地“执行” ,因为每次您要调用方法时,选项2都会导致巨大的操作。(是的,作为粗略的性能测试,您可以通过for循环运行每个选项并比较经过的时间,但是应该很容易看出:其他所有条件都相同,n次创建一个对象比创建一个对象要花费更多的时间一个对象一次)。

但是,夸大示例中的性能本身并不一定是在所有情况下都支持选项1的原因。

建筑学

选项2

确实归结于的体系结构SomeObject什么 SomeObject可能SomeObject是这个对象在你的整个生命中都无法保持开放A; 例如,可能是某种流读取器在从流中读取资源时锁定了该资源。在这种情况下,您可能不希望一直SomeObject“打开”阻塞该资源;应将其放置method()通话结束时

选项1

是的,但是也许SomeObject是公开业务逻辑的服务或外观之类的东西。正如您在问题中提到的那样,它是“更好的测试”,完整的答案是,是的,它使依赖注入变得更容易,这是单元测试的关键组成部分。(尽管通常将其重写为private SomeObject a;,使用类似构造函数的构造函数public a (SomeObject a) { this.a = a; }来遵循控制范式的依赖项注入/反转。但是,对于此问题,最终结果是相同的。)

对于(精心设计的)服务或实用程序功能,您希望它可以自己(私下)处理对象。这种情况下使用最多的模式是选项1,因为它为您提供了一个管理依赖项的地方,而不是在使用它的每种方法中。

你的选择

了解上述内容应足以做出明智的决定。

  • 选项1-服务,外观,公用事业等
  • 选项2-需要处置的物品;对象实现Closable,比如StreamReaderFileWriter等等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何用字段或局部变量初始化Java中的对象?

来自分类Dev

使用了未初始化的局部变量“xAxis”

来自分类Dev

使用了未初始化的局部变量“totalPrice”

来自分类Dev

局部变量初始化错误

来自分类Dev

Python局部变量初始化

来自分类Dev

局部变量初始化

来自分类Dev

TASM初始化局部变量

来自分类Dev

Bash局部变量初始化

来自分类Dev

如何在 C++ 中初始化一个局部结构对象(不能创建一个新对象作为局部变量)?

来自分类Dev

如何避免Java编译错误“局部变量可能尚未初始化”?(是的,很认真!)

来自分类Dev

在Java中,“初始化局部变量”的确切含义是什么?

来自分类Dev

如何初始化布尔类型以供局部变量使用?

来自分类Dev

在Visual Basic中是否可以获得“使用未初始化的局部变量”的警告?

来自分类Dev

使用速记符号声明和初始化变量:类变量与局部变量

来自分类Dev

为什么Java默认只初始化类变量而不初始化局部变量?

来自分类Dev

使用局部变量初始化静态变量时

来自分类Dev

在初始化后的事件定义中,为什么会出现错误18使用未分配的局部变量'beforeEvntDrawArg'

来自分类Dev

在初始化后的事件定义中,为什么会出现错误18使用未分配的局部变量'beforeEvntDrawArg'

来自分类Dev

禁用局部变量的未初始化警告

来自分类Dev

未初始化的局部变量,c ++ 11默认

来自分类Dev

局部变量初始化和开关选择

来自分类Dev

未初始化的局部变量,绕过cin语句

来自分类Dev

未初始化的局部变量c4700

来自分类Dev

静态局部变量被重新初始化

来自分类Dev

隐式类型的局部变量必须初始化

来自分类Dev

隐式类型的局部变量必须初始化

来自分类Dev

局部变量初始化和开关选择

来自分类Dev

在闭包内部初始化局部变量

来自分类Dev

局部变量保持未初始化

Related 相关文章

  1. 1

    如何用字段或局部变量初始化Java中的对象?

  2. 2

    使用了未初始化的局部变量“xAxis”

  3. 3

    使用了未初始化的局部变量“totalPrice”

  4. 4

    局部变量初始化错误

  5. 5

    Python局部变量初始化

  6. 6

    局部变量初始化

  7. 7

    TASM初始化局部变量

  8. 8

    Bash局部变量初始化

  9. 9

    如何在 C++ 中初始化一个局部结构对象(不能创建一个新对象作为局部变量)?

  10. 10

    如何避免Java编译错误“局部变量可能尚未初始化”?(是的,很认真!)

  11. 11

    在Java中,“初始化局部变量”的确切含义是什么?

  12. 12

    如何初始化布尔类型以供局部变量使用?

  13. 13

    在Visual Basic中是否可以获得“使用未初始化的局部变量”的警告?

  14. 14

    使用速记符号声明和初始化变量:类变量与局部变量

  15. 15

    为什么Java默认只初始化类变量而不初始化局部变量?

  16. 16

    使用局部变量初始化静态变量时

  17. 17

    在初始化后的事件定义中,为什么会出现错误18使用未分配的局部变量'beforeEvntDrawArg'

  18. 18

    在初始化后的事件定义中,为什么会出现错误18使用未分配的局部变量'beforeEvntDrawArg'

  19. 19

    禁用局部变量的未初始化警告

  20. 20

    未初始化的局部变量,c ++ 11默认

  21. 21

    局部变量初始化和开关选择

  22. 22

    未初始化的局部变量,绕过cin语句

  23. 23

    未初始化的局部变量c4700

  24. 24

    静态局部变量被重新初始化

  25. 25

    隐式类型的局部变量必须初始化

  26. 26

    隐式类型的局部变量必须初始化

  27. 27

    局部变量初始化和开关选择

  28. 28

    在闭包内部初始化局部变量

  29. 29

    局部变量保持未初始化

热门标签

归档