繁体   English   中英

Class 方法与实例方法

[英]Class methods vs instance methods

嗨,class 方法是否通常比实例方法更快,因为它不需要加载实例? 如果是这样,我们是否应该尽可能使用 class 方法? 谢谢

不管什么更快,多少,您需要记住一个主要区别:

  • 您不能@Override一个 static 方法!

这非常重要,因为您本质上说您不会也不能使用 Java 中的主要优势之一,即覆盖子类对象中的方法。 当您调用 static 方法时,您将继续使用该 static 方法,并且不能在子类对象中覆盖它。

还要解决“哪个更快”,然后构建一个真正的测试,而不仅仅是一个微基准来调查实际发现。 使用多个 JVM 进行测量,因为 JIT 实现可能会影响这一点。

如果一个方法不需要实例,IMO 它应该是一个 class 方法。 而且由于 class 方法只有在您不使用实例的情况下才有可能,那么您的问题

我们是否应该尽可能使用 class 方法

有一个肯定的答案。

但绝对不是出于效率原因

不,它们并不快。

但是,只要有可能,最好使用 class 方法,因为这样您就表明方法内部的逻辑不需要访问任何成员变量。

我是说 - 不要使用实例方法,它可以是 static。

class 的每个实例和当前实例的“实例方法”都可以使用“类方法”。 所以我不明白为什么 class 方法在应用于所有实例时会更快......

虽然 class 方法可能更快,但您绝对不应该以这种思维方式编写代码。 您应该在需要时使用 class 方法。 Arrays 等实用程序类就是一个很好的例子。 返回 singleton 的工厂。 当您需要访问 class 的内部时,切勿使用它们。

在比较 class 方法和实例方法时,尽量把实例方法想象成 class 方法有一个额外的参数叫做this (其实现在有些语言实现了实例方法)

所以问题变成了,“如果我的方法少一个参数,它会更快吗?” 这个问题并没有真正的意义,因为参数列表在很大程度上与性能无关。

尝试根据方法的性质和所需的数据来决定方法是否应该是 static 或实例,而不是基于一些过早的性能优势。 是的,性能是一个特性,但它不是唯一的特性。

最后一条性能经验法则:测量、测量、测量。 仅仅因为一些书或文章说某事应该更快,并不意味着它会为你工作。 在您的真实案例中进行尝试,并使用经验数据进行备份。

根据我的经验,如果您需要初始化 object 并以任何方式保留它,例如使用数组等。最好在该特定实例上调用实例方法。
调用 Class 方法然后将您刚刚初始化的同一个实例作为参数传递给该 Class 方法是没有意义的。 我不确定运行时的效果,但这样做似乎是一种浪费(名义上的与否)。

我主要使用 class 方法进行不需要初始化的操作,只要我可以。 例如,我的 MathFunctions class 包含了我所有的三角函数方法。 没有必要初始化和创建一个 MathFunctions object 然后调用实例方法只是为了从这些方法之一获得任意结果。 简单地调用 class 方法更容易(也更快)。

所以在任何一种情况下,都没有“类方法>实例方法”或反之亦然。 这仅取决于您的应用程序和您的需求。 首先使用常识,如果您发现自己为保存最少数据的类(例如 MathFunctions)初始化对象,那么使用 Class 方法可能会更好。
但另一方面,如果您发现自己正在初始化对象,然后将它们作为 arguments 传递给 Class 方法,那么使用实例方法很可能会更好。

那是我的两分钱,我对编程还是比较陌生,所以请记住这一点。

我一般不知道,但我记得前段时间测量了一些应用程序,static 方法确实更快。

从设计的角度来看,我认为任何可以合理地使用 static 的方法(意味着没有明确地将实例作为参数或类似的东西传递)都应该是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM