代码之家  ›  专栏  ›  技术社区  ›  Matt

JavaSuntLon vs静态-是否有真正的性能效益?

  •  15
  • Matt  · 技术社区  · 16 年前

    我正在合并一个cvs分支,其中一个更大的更改是在任何发生单件模式的地方替换它与具有静态初始化块和所有静态方法的抽象类。

    这是值得保留的东西吗,因为它需要合并大量的冲突,我希望在哪种情况下重构是值得的?

    我们在weblogic 8.1(so jdk 1.4.2)下运行此应用程序


    对不起,托马斯,让我澄清一下……

    head版本具有传统的单例模式(private constructor、getInstance()等)

    分支版本没有构造函数,是“公共抽象类”,并将对象上的所有方法修改为“静态”。以前存在于私有构造函数中的代码被移到静态块中。

    然后,类的所有用法都会更改,从而导致合并中出现多个冲突。

    在一些情况下做出了这种改变。

    7 回复  |  直到 16 年前
        1
  •  15
  •   Damien B    16 年前

    从严格的运行时性能的角度来看,这种差异实际上可以忽略不计。两者的主要区别在于“静态”生命周期链接到类加载器,而对于单例生命周期则是常规的实例生命周期。通常,最好远离类加载器业务,避免一些棘手的问题,尤其是在尝试重新加载Web应用程序时。

        2
  •  16
  •   levand    16 年前

    如果需要存储任何状态,我将使用单例,否则将使用静态类。实例化某个东西是没有意义的,即使是单个实例,除非它需要存储某个东西。

        3
  •  11
  •   itsadok    16 年前

    静态不利于扩展性,因为静态方法和字段不能被子类扩展或重写。

    这对单元测试也不好。在一个单元测试中,您不能防止不同测试的副作用溢出,因为您不能控制类加载器。在一个单元测试中初始化的静态字段将在另一个单元测试中可见,或者更糟的是,并发运行测试将产生不可预知的结果。

    当少量使用时,singleton通常是一个不错的模式。我更喜欢使用DI框架,让它为我管理我的实例(可能在不同的范围内,如guice中)。

        4
  •  3
  •   Thomas Owens    16 年前

    如果我最初的帖子是正确的理解,并且太阳报的讨论是准确的(我认为可能是这样),那么我认为你必须在清晰性和表现之间做出权衡。

    问问自己这些问题:

    1. singleton对象是否更清楚地说明了我在做什么?
    2. 我需要一个对象来完成这个任务,还是它更适合静态方法?
    3. 我是否需要不使用单件的性能?
        5
  •  3
  •   Cem Catikkas    16 年前

    根据我的经验,唯一重要的是哪一个更容易在单元测试中模拟。我总觉得单挑更容易,也更自然。如果您的组织允许您使用jmockit,那么这并不重要,因为您可以克服这些问题。

        6
  •  0
  •   EdgarVerona    16 年前

    这个讨论有帮助吗?(我不知道链接到另一个编程论坛是否是禁忌,但我宁愿不引用整个讨论。)

    Sun Discussion on this subject

    结论似乎是,尽管静态方法在技术上更有效,但在大多数情况下,它并没有产生足够大的差异。

        7
  •  0
  •   Rob Spieldenner    16 年前

    写一些代码来衡量性能。答案将取决于JVM(Sun的JDK的性能可能与Jrockit不同),并且VM会标记应用程序使用的标志。