嗨,类方法是否通常比实例方法更快,因为它不需要加载实例?如果是这样,我们应该尽可能使用类方法吗?谢谢
9 回答
不管什么更快,多少,您需要记住一个主要区别:
- 你不能
@Override
使用静态方法!
这非常重要,因为您本质上说您不会也不能使用 Java 的主要优势之一,即覆盖子类对象中的方法。当您调用静态方法时,您将继续使用该静态方法并且不能在子类对象中覆盖它。
还要解决“哪个更快”,然后构建一个真正的测试,而不仅仅是一个微基准来调查实际发现。使用多个 JVM 进行测量,因为 JIT 实现可能会影响这一点。
如果一个方法不需要实例,IMO 它应该是一个类方法。而且由于只有在不使用实例的情况下才可能使用类方法,所以您的问题
我们是否应该尽可能使用类方法
有一个肯定的答案。
但绝对不是出于效率原因
不,它们并不快。
但是,尽可能使用类方法是一种很好的做法,因为这样您就表明方法内部的逻辑不需要访问任何成员变量。
我是说 - 不要使用实例方法,它可以是静态的。
“类方法”可用于类的每个实例,“实例方法”仅适用于当前实例。所以我不明白为什么一个类方法在应用于所有实例时会更快......
根据我的经验,如果您需要初始化一个对象并以任何方式保留它,例如使用数组等。最好在该特定实例上调用实例方法。
调用类方法然后将刚刚初始化的同一个实例作为该类方法的参数传递是没有意义的。我不确定运行时的效果,但这样做似乎是一种浪费(名义上的与否)。
我主要将类方法用于不需要初始化的操作,只要我可以。例如,我的 MathFunctions 类包含我所有的三角函数方法。没有必要初始化和创建一个 MathFunctions 对象,然后调用实例方法只是为了从这些方法之一获得任意结果。简单地调用类方法更容易(也更快)。
所以在任何一种情况下,都没有“类方法>实例方法”或反之亦然。这仅取决于您的应用程序和您的需求。最重要的是使用常识,如果您发现自己为保存最少数据的类(例如 MathFunctions)初始化对象,那么使用类方法可能会更好。
但另一方面,如果您发现自己正在初始化对象,然后将它们作为参数传递给类方法,那么使用实例方法很可能会更好。
那是我的两分钱,我对编程还是比较陌生,所以请记住这一点。
虽然类方法可能更快,但您绝对不应该以这种思维方式编写代码。您应该在需要时使用类方法。像 Arrays 这样的实用程序类就是一个很好的例子。返回单例的工厂。当您需要访问类的内部时,切勿使用它们。
比较类方法和实例方法时,尽量把实例方法想成是有一个额外参数调用的类方法this
(其实现在有些语言实现了实例方法)
所以问题变成了,“如果我的方法少一个参数,它会更快吗?” 这个问题并没有真正的意义,因为参数列表在很大程度上与性能无关。
尝试根据方法的性质和所需的数据来决定方法是静态还是实例,而不是基于一些过早的性能优势。是的,性能是一个特性,但它不是唯一的特性。
最后一条性能经验法则:测量、测量、测量。仅仅因为一些书或文章说某事应该更快,并不意味着它会为你工作。在您的真实案例中进行尝试,并使用经验数据进行备份。
我一般不知道,但我记得前段时间测量了一些应用程序,静态方法确实更快。
从设计的角度来看,我认为任何可以明智地是静态的方法(意味着没有明确地将实例作为参数或类似的东西传递)都应该是。