何时应该使用静态方法?涉及到IT技术,这是一个提问标题。

35
此外,静态方法相对于实例方法是否有性能优势?
我最近看到了以下内容:http://www.cafeaulait.org/course/week4/22.html
“何时应使用静态方法? ”

不读取也不写入实例字段

  • 与对象状态无关
  • 接受参数的数学方法,对这些参数应用算法并返回值
  • 服务于构造函数的工厂方法
  • 我非常希望得到 Stack Overflow 社区的意见反馈。
    8个回答

    24

    当方法不属于实例时,请将其设置为静态方法。不要过分追求微观优化。

    你可能会发现有很多私有方法可以设置为静态方法,但你总是从实例方法(或彼此之间)调用它们。在这种情况下,并不会有太大的影响。但是,如果你想实际地测试代码,并且可能从其他地方使用它,则可以考虑将这些静态方法放在一个不可实例化的不同类中。


    21
    无论一个方法是否是静态的,都更多是设计考虑而非效率问题。静态方法属于一个类,而非静态方法则属于一个对象。如果你有一个Math类,你可能会有一些静态方法来处理加法和减法,因为这些是与数学相关的概念。然而,如果你有一个Car类,你可能会有一些非静态方法来改变挡位和转向,因为这些是与特定车辆相关的,而不是与汽车概念本身相关的。

    12
    另一个关于静态方法的问题是,在Java中至少,为它们编写单元测试非常痛苦。您无法以任何方式模拟静态方法。有一篇Google测试博客上关于这个问题的文章
    我的经验法则是仅在静态方法没有外部依赖(如数据库访问、读取文件、发送电子邮件等)时才编写它们,以尽可能简单。

    谢谢您的回答。我经常将一些方法设为静态的(因为它们并不是实例的直接部分)。但现在我避免将这些方法设为静态的,因为您所说的拟造将无法实现。 - phil

    2
    只需记住,每当您编写静态方法时,您正在编写一种行为不易修改的不灵活方法。
    您正在编写过程式代码,因此如果它是过程式的,则应这样做。如果不是,那么它可能应该是一个实例方法。
    这个想法来自Steve Yegge的一篇文章,我认为这是一篇有趣且有用的阅读材料。

    1

    就性能而言,C++中的静态方法可以比非虚实例方法略快,因为不需要将'this'指针传递给方法。反过来,两者都比虚拟方法更快,因为不需要VMT查找。

    但是,这可能只是微不足道的差距——特别是对于允许优化掉不必要参数传递的语言。


    当它真正重要的时候(大部分时间),编译器会将其完全优化掉。 - Tom Hawtin - tackline
    在C++中,它无法被优化掉。调用者无法知道被调用者是否会使用"this",因此必须无论如何都要传递它。对于其他语言,则因情况而异。 - Roddy

    1

    @jagmal,我认为你在某个地方搞混了 - 你列举的所有示例都显然不是静态方法。

    静态方法应该完全处理类的抽象属性和概念 - 它们绝不能与实例特定属性相关(大多数编译器如果这样做会报错)。

    对于汽车示例,速度、行驶公里数显然与属性相关。当考虑到汽车级别时,换挡和速度计算是属性相关的 - 但是考虑到从汽车继承的carModel类:此时它们可以成为静态方法,因为所需的属性(例如轮径)可以在该级别上定义为常量。


    3
    你说得对。我真的把事情搞混了。可能是因为那段时间我睡眠不足。为了遵循SO的精神,我已经删除了评论,而且我认为我没有比别人已经说过的更多要补充的了。无论如何,还是谢谢。 - Jagmal

    0
    在将方法设置为静态时,需要考虑的另一件事情是,任何能够看到该类的人都可以调用静态方法。而当方法是实例方法时,只有那些能够访问实例的人才能调用该方法。

    0

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接