
When should a method be static?另外,静态方法与实例方法相比在性能上有什么优势吗? 我最近遇到了以下内容:http://www.cafeaulait.org/course/week4/22.html:
我会对Stack Overflow社区对此的反馈非常感兴趣。 当方法不属于实例时,使它们成为静态方法。不要费力进行微优化。 您可能会发现有很多私有方法可能是静态的,但是总是从实例方法(或彼此)中调用。在那种情况下,它并不重要。但是,如果您想真正地测试您的代码,并可能在其他地方使用它,则可能需要考虑在不同的,不可实例化的类中创建这些静态方法。 方法是否是静态的,更多的是设计方面的考虑,而不是效率方面的考虑。静态方法属于一个类,非静态方法属于一个对象。如果您有Math类,则可能有一些静态方法来处理加法和减法,因为这些是与Math相关的概念。但是,如果您有Car类,则可能有几种非静态方法来更改齿轮和转向,因为这些方法与特定的汽车相关联,而不是与一般的汽车概念相关联。 静态方法的另一个问题是为它们编写单元测试非常麻烦-至少在Java中是如此。您不能以任何方式模拟静态方法。谷歌测试博客上有一篇关于这个问题的文章。 我的经验法则是仅在没有外部依赖项(例如数据库访问,读取文件,电子邮件等)的情况下编写静态方法,以使它们尽可能简单。 只需记住,每当编写静态方法时,您就在编写一种不灵活的方法,该方法无法非常轻松地修改其行为。 您正在编写过程代码,因此,如果有必要进行过程编程,则可以这样做。如果不是,则可能应该是实例方法。 这个想法来自Steve Yegge的一篇文章,我认为这是一篇有趣而有用的文章。 @jagmal我认为您在某处有一些电线-您列出的所有示例显然都不是静态方法。 静态方法应该完全处理抽象的属性和类的概念-静态方法绝不应该与实例特定的属性相关(大多数编译器会大喊大叫)。 以汽车为例,速度,行驶公里数显然与属性相关。在汽车级别考虑时,变速和速度计算是属性相关的-但请考虑从汽车继承的carModel类:在这一点上,它们可以成为静态方法,因为所需的属性(例如车轮直径)可以定义为该级别的常量。 从性能角度来看,C ++静态方法可能比非虚拟实例方法稍快,因为不需要" this"指针来传递给该方法。反过来,由于不需要VMT查找,因此两者都比虚拟方法快。 但是,它可能会降低噪音-特别是对于允许不必要的参数传递进行优化的语言。 将方法设为静态时要考虑的另一件事是,任何能够看到该类的人都可以调用静态方法。而当方法是实例方法时,只有那些有权访问实例的人才能调用该方法。 这是有关String.Format为什么是静态的相关讨论,它将突出一些原因。 |