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

Pra*_*haT 14 java performance static

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

改变这样的方法static是否会对程序产生任何性能影响?

Mat*_*att 19

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

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

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

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

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


Jon*_*eet 17

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

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

另一方面,这确实降低了灵活性:如果这些实用程序方法中的任何一个包含您可能希望以多态方式变化的功能(例如,出于测试目的),则考虑将它们保留为实例方法 - 并尝试提取一些有意义的类名来表示涉及"事物".(例如,FooConverter实例化是有意义的 - 一个FooUtil没有.)

  • 第二段+1.如果使用静态方法,则无法交换实现. (4认同)