Language agnostic 什么时候一个方法应该是静态的?

Language agnostic 什么时候一个方法应该是静态的?,language-agnostic,static,Language Agnostic,Static,此外,静态方法是否比实例方法有性能优势 我最近遇到了以下情况: 什么时候一个方法应该是静态的 既不读取实例字段,也不写入实例字段 独立于对象的状态 接受参数的数学方法,对这些参数应用算法 参数,并返回一个值 代替施工人员的工厂方法 我对Stack Overflow社区对此的反馈非常感兴趣。这里有一个相关的讨论,它将强调一些原因。当方法不是实例的一部分时,使它们成为静态的。不要担心微观优化 您可能会发现有很多私有方法可能是静态的,但您总是从实例方法(或彼此)调用。在这种情况下,这其实并不重要。但是

此外,静态方法是否比实例方法有性能优势

我最近遇到了以下情况:

什么时候一个方法应该是静态的

  • 既不读取实例字段,也不写入实例字段
  • 独立于对象的状态
  • 接受参数的数学方法,对这些参数应用算法 参数,并返回一个值
  • 代替施工人员的工厂方法

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

    这里有一个相关的讨论,它将强调一些原因。

    当方法不是实例的一部分时,使它们成为静态的。不要担心微观优化


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

    方法是否是静态的,更是一种设计考虑,而不是效率。静态方法属于类,而非静态方法属于对象。如果你有一门数学课,你可能会有一些静态的方法来处理加减法,因为这些是与数学相关的概念。但是,如果你有一个汽车类,你可能有一些非静态方法来改变齿轮和转向,因为这些与特定的汽车相关,而不是一般的汽车概念。

    性能明智的,C++静态方法可以比非虚拟实例方法稍微快一些,因为不需要将“this”指针传递给该方法。反过来,这两种方法都比虚拟方法快,因为不需要VMT查找


    但是,它很可能就在噪音中——特别是对于允许优化不必要的参数传递的语言。

    @jagmal我想你在某些地方遇到了问题——你列出的所有示例显然不是静态方法

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


    以汽车为例,速度、公里数显然与属性相关。当在轿厢级考虑时,换档和速度计算是与属性相关的,但是考虑一个继承CARE模型的CARMODEL类:在这一点上,它们可以成为静态方法,作为所需的属性(例如车轮直径)。可以定义为该级别的常量。

    请记住,无论何时编写静态方法,都是在编写一个不灵活的方法,无法很容易地修改其行为

    您正在编写过程性代码,因此,如果过程性代码有意义,那么就这样做。如果不是,它可能应该是一个实例方法


    我认为这是一篇有趣而有用的文章。

    静态方法的另一个问题是,为它们编写单元测试是相当痛苦的,至少在Java中是这样。您不能以任何方式模拟静态方法。有一个问题


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

    < P>静态方法的另一个问题是,任何人都能看到类能够调用静态方法。而当METHOD是实例方法时,只有那些访问实例的人才能够调用该方法。

    在编译器在其重要的时候(大部分时间)完全被优化掉。C++无法优化它。调用者无法知道被调用者不会使用“this”,因此无论如何都必须传递它。对于其他语言,YMMV。你是对的。我真的把事情搞混了。可能是因为那几天我睡眠不足。本着这样的精神,我删除了这条评论,我想除了人们已经告诉我的之外,我没有什么要补充的了。谢谢你,谢谢你的回答。我经常使一些方法是静态的(因为它们实际上并不是实例的直接部分)。但现在我避免让这些方法成为静态的,因为你是对的,模仿是不可能的