什么时候应该是静态方法?

时间:2020-03-05 18:49:03  来源:igfitidea点击:

另外,静态方法与实例方法相比在性能上有什么优势吗?

我最近遇到了以下内容:http://www.cafeaulait.org/course/week4/22.html:

When should a method be static?
  
  
  Neither reads from nor writes to instance fields
  Independent of the state of the object
  Mathematical methods that accept arguments, apply an algorithm to those
  arguments, and return a value
  Factory methods that serve in lieu of constructors

我会对Stack Overflow社区对此的反馈非常感兴趣。

解决方案

回答

这是有关String.Format为什么是静态的相关讨论,它将突出一些原因。

回答

当方法不属于实例时,使它们成为静态方法。不要费力进行微优化。

我们可能会发现有很多私有方法可能是静态的,但是我们总是从实例方法(或者彼此)中调用。在那种情况下,它并不重要。但是,如果我们想真正地测试代码,并可能在其他地方使用它,则可能需要考虑在不同的,不可实例化的类中制作这些静态方法。

回答

方法是否是静态的,更多的是设计方面的考虑,而不是效率方面的考虑。静态方法属于类,非静态方法属于对象。如果我们有Math类,则可能有一些静态方法来处理加法和减法,因为这些是与Math相关的概念。但是,如果我们有Car类,则可能有几种非静态方法来更改齿轮和转向,因为这些方法与特定的汽车相关联,而不是与一般的汽车概念相关联。

回答

从性能角度来看,C ++静态方法可能比非虚拟实例方法要快一些,因为不需要" this"指针来传递给该方法。反过来,这两种方法都将比虚拟方法更快,因为不需要VMT查找。

但是,尤其是对于那些允许优化不必要的参数传递的语言而言,它的噪声可能会降低。

回答

@jagmal我认为我们列出的所有示例显然不是静态方法,在某些地方有些交叉。

静态方法应该完全处理抽象属性和类的概念,而绝不应该与实例特定的属性相关联(大多数编译器会大喊大叫)。

以汽车为例,速度,行驶公里数显然与属性相关。在汽车级别考虑变速和速度计算时,它们是属性相关的,但请考虑从汽车继承的carModel类:在这一点上,它们可以成为静态方法,因为所需的属性(例如车轮直径)可以定义为常量在那个水平上。

回答

只需记住,无论何时编写静态方法,都在编写一种不灵活的方法,该方法无法非常轻松地修改其行为。

我们正在编写过程代码,因此,如果对过程代码有意义,那么就去做。如果没有,它可能应该是一个实例方法。

这个想法来自Steve Yegge的一篇文章,我认为这是一篇有趣而有用的文章。

回答

静态方法的另一个问题是,至少要用Java为它们编写单元测试是很痛苦的。我们不能以任何方式模拟静态方法。谷歌测试博客上有一篇关于这个问题的文章。

我的经验法则是仅在静态方法没有外部依赖项(例如数据库访问,读取文件,电子邮件等)时编写静态方法,以使它们尽可能简单。