实用程序类的静态与非静态方法的性能

时间:2012-11-08 12:08:47

标签: java performance static

我有一个实用程序类,它具有非静态方法,没有实例变量。所以我想将所有方法转换为static方法。我怀疑会有任何记忆或性能影响。但我只是想确认一下。

将此类方法更改为static会对程序产生任何性能影响吗?

7 个答案:

答案 0 :(得分:19)

最后要添加人们在这里说的话。

使用static方法的开销略低,因为您已经保证编译时绑定。静态方法调用将创建字节码指令invokestatic。 ]

在典型的场景中,实例方法在运行时绑定,并将创建字节码指令invokevirtual,其开销高于invokestatic

然而,这只有在数百万次迭代的情况下变得相关,我会提醒你不要这样做会推动你的课堂设计。从设计角度做有意义的事情。根据您的描述,static方法可能是最佳选择。实际上,这是创建实用程序类的相对标准做法:

public class MyUtilities {
   private MyUtilities() { } // don't let anyone construct it.
   public static String foo(String s) { ... }
}

答案 1 :(得分:17)

编辑:解决性能问题:不必毫无意义地创建某个实例,但差别很可能完全无关。随着时间的推移,专注于清晰的设计更有可能是重要的。

实用程序方法通常是静态的,如果类中的所有方法都是静态的,那么可能值得创建类final并包含一个私有构造函数来阻止即时。从根本上说,对于不代表任何真实“事物”的实用程序类,构造实例没有逻辑意义 - 所以要防止它。

另一方面,这确实会降低灵活性:如果这些实用程序方法中的任何一个包含您可能想要多态化的功能(例如用于测试目的),那么请考虑将它们作为实例方法 - 并尝试提取一些有意义的类名代表所涉及的“事物”。 (例如,FooConverter有意义实例化 - FooUtil没有。)

答案 2 :(得分:3)

如果实用程序类没有子类,则将不访问实例变量的方法转换为static是个好主意。您应该检查代码并将调用转换为静态语法,即

int res = utilityInstance.someMethod(arg1, arg2);

应转换为

int res = UtilityClass.someMethod(arg1, arg2);

为了清楚起见。

没有明显的性能影响:虽然理论上静态调用的成本略低,但在大多数情况下,差异太小而不能认为重要。

答案 3 :(得分:3)

有资格转换为static的方法必须满足两个要求:

  1. 未访问任何实例变量(在您的情况下满足此要求);
  2. 永远不需要受到压倒(为此你可能需要考虑一下)。
  3. 但是,当满足这些要求时,实际上建议使方法成为静态,因为它会缩小方法在其中运行的上下文。

    最后,请注意这里有没有性能问题,任何理论上的差异实际上都支持静态方法,因为它们不涉及动态方法解析。但是,实例方法调用在任何相关的JVM实现中都非常快速。

    就记忆而言,故事是相同的:理论差异是支持静态方法,但如果与单例实用程序类进行比较,则没有实际差异。

答案 4 :(得分:1)

没有状态的实用程序类(例如java.lang.Math)通常具有公共静态方法。这样您就不需要创建类的实例来使用它。

答案 5 :(得分:0)

当您打算经常使用特定功能时,静态方法是个好主意。

答案 6 :(得分:-2)

不同之处在于您需要一个实例才能使用它们,因此用户必须创建一个实例