我有一个实用程序类,它具有非静态方法,没有实例变量。所以我想将所有方法转换为static
方法。我怀疑会有任何记忆或性能影响。但我只是想确认一下。
将此类方法更改为static
会对程序产生任何性能影响吗?
答案 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
的方法必须满足两个要求:
但是,当满足这些要求时,实际上建议使方法成为静态,因为它会缩小方法在其中运行的上下文。
最后,请注意这里有没有性能问题,任何理论上的差异实际上都支持静态方法,因为它们不涉及动态方法解析。但是,实例方法调用在任何相关的JVM实现中都非常快速。
就记忆而言,故事是相同的:理论差异是支持静态方法,但如果与单例实用程序类进行比较,则没有实际差异。
答案 4 :(得分:1)
没有状态的实用程序类(例如java.lang.Math
)通常具有公共静态方法。这样您就不需要创建类的实例来使用它。
答案 5 :(得分:0)
当您打算经常使用特定功能时,静态方法是个好主意。
答案 6 :(得分:-2)
不同之处在于您需要一个实例才能使用它们,因此用户必须创建一个实例