关于不可知的语言:什么时候方法应该是静态的?

关于不可知的语言:什么时候方法应该是静态的?

When should a method be static?

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

我最近遇到了以下内容: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社区对此的反馈非常感兴趣。


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

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


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


    静态方法的另一个问题是为它们编写单元测试非常麻烦-至少在Java中是如此。您不能以任何方式模拟静态方法。谷歌测试博客上有一篇关于这个问题的文章。

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


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

    您正在编写过程代码,因此,如果有必要进行过程编程,则可以这样做。如果不是,则可能应该是实例方法。

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


    @jagmal我认为您在某处有一些电线-您列出的所有示例显然都不是静态方法。

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

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


    从性能角度来看,C ++静态方法可能比非虚拟实例方法稍快,因为不需要" this"指针来传递给该方法。反过来,由于不需要VMT查找,因此两者都比虚拟方法快。

    但是,它可能会降低噪音-特别是对于允许不必要的参数传递进行优化的语言。


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


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


    推荐阅读

      linux命令是什么语言?

      linux命令是什么语言?,系统,环境,代码,传播,管理,语言,操作系统,源码,自由,

      linux查看性能的命令?

      linux查看性能的命令?,系统,情况,信息,数据,状态,指标,第一,分析,命令,宏观,l

      linux改语言命令行?

      linux改语言命令行?,系统,环境,工具,密码,概念,地方,软件,通信,管理,国际,lin

      linux命令行c语言?

      linux命令行c语言?,代码,系统,工具,环境,工作,保险,发行,命令,文件,终端,linu

      c语言在linux命令?

      c语言在linux命令?,系统,工作,管理,命令,保险,基础,环境,信息,文件,语言,linu

      linux编写c语言命令?

      linux编写c语言命令?,系统,基础,环境,代码,盘面,保险,百度,情况,数据,工具,在

      linux性能测试命令?

      linux性能测试命令?,数据,系统,工具,标准,设备,地址,情况,基础,网络,环境,如

      linux命令3d性能?

      linux命令3d性能?,系统,工具,实时,百分比,信息,分析,软件,情况,网站,建设,Lin

      linux改变语言命令?

      linux改变语言命令?,系统,管理,网上,官方网站,情况,服务,中文,语言,命令,终

      c语言编译linux命令?

      c语言编译linux命令?,代码,工具,环境,系统,基础,保险,百度,语言,源程序,文件

      linux性能管理命令?

      linux性能管理命令?,工具,系统,信息,状态,网络,情况,工作,时间,短信,平均,lin

      linux性能调参命令?

      linux性能调参命令?,工具,工作,信息,网络,分析,系统,地址,实时,管理,状态,在l

      linux命令输入方法?

      linux命令输入方法?,系统,电脑,密码,管理,地址,命令,网站,工具,首开,位置,lin

      linux常用命令语言?

      linux常用命令语言?,工作,地址,系统,信息,命令,目录,标准,管理,工具,服务,lin

      r语言命令行写linux?

      r语言命令行写linux?,环境,数据,系统,工具,简介,官网,语言,报告,软件,发展,如

      linux性能找不打命令?

      linux性能找不打命令?,系统,实时,软件,名字,分析,信息,情况,工具,电脑,时间,l

      linux语言查找命令行?

      linux语言查找命令行?,系统,工作,位置,标准,地址,信息,命令,管理,时间,文件,