Java:何时使用静态方法

我想知道什么时候使用静态方法? 假如我有一个有几个getter和setter的类,一个或两个方法,我希望这些方法只能在类的实例对象上调用。 这是否意味着我应该使用静态方法?

例如

Obj x = new Obj();
x.someMethod

要么

Obj.someMethod

(这是静态的方式?)

我很困惑!


一个经验法则是:问问自己“调用这个方法是否合理,即使没有构造Obj?” 如果是这样,它肯定应该是静态的。

所以在Car类中,你可能会有一个double convertMpgToKpl(double mpg) ,它可能是静态的,因为人们可能想知道35mpg转换成什么,即使没有人构建过Car。 但是void setMileage(double mpg) (设置一个特定Car的效率)不能是静态的,因为在任何Car构造之前调用该方法是不可想象的。

(顺便说一句,反过来并不总是正确的:你有时可能有一个涉及两个Car对象的方法,并且仍然希望它是静态的,例如Car theMoreEfficientOf( Car c1, Car c2 ) 。虽然这可以转换为非静态版本,有人会认为既然没有“特权”选择哪辆车更重要,你不应该强迫呼叫者选择一辆车作为你调用该方法的对象。尽管如此,对于所有静态方法的一小部分)。


仅在以下方案中定义静态方法:

  • 如果你正在编写实用程序类,并且它们不应该被改变。
  • 如果该方法没有使用任何实例变量。
  • 如果有任何操作不依赖于实例创建。
  • 如果有一些代码可以很容易地被所有的实例方法共享,那么将这些代码抽取到静态方法中。
  • 如果你确定方法的定义永远不会被改变或覆盖。 由于静态方法不能被覆盖。

  • 有一些有效的理由使用静态方法:

  • 性能 :如果你想要运行一些代码,并且不想实例化一个额外的对象来实现,可以将它转换为静态方法。 JVM也可以优化静态方法(我想我曾经读过James Gosling声明你不需要JVM中的自定义指令,因为静态方法一样快,但找不到源代码 - 因此它可能是完全错误的)。 是的,这是微型优化,可能不需要。 我们的程序员从来不会做不必要的事情,只是因为它们很酷,对吧?

  • 实用性 :不是调用new Util().method(arg)Util.method(arg)调用Util.method(arg)method(arg)静态导入。 更简单,更短。

  • 添加方法 :你真的希望类String有一个removeSpecialChars()实例方法,但它不存在(它不应该,因为你的项目的特殊字符可能不同于其他项目),并且你不能添加它(因为Java有点理智),所以你创建了一个工具类,并调用removeSpecialChars(s)而不是s.removeSpecialChars() 。 甜。

  • 纯度 :采取一些预防措施,你的静态方法将是一个纯函数,也就是说,它唯一依赖的是它的参数。 数据输入,数据输出。 这样更容易阅读和调试,因为您不需要担心继承问题。 你也可以用实例方法来实现,但编译器会通过静态方法(通过不允许引用实例属性,覆盖方法等)来帮助你多一点。

  • 如果你想创建一个单例,你还必须创建一个静态方法,但是......不。 我的意思是,三思。

    现在,更重要的是,为什么你不想创建一个静态方法? 基本上, 多态性不在窗口中 。 你将无法重写该方法,也不能在接口中声明它(在Java 8之前)。 它从设计中需要很大的灵活性。 另外,如果你需要状态 ,如果你不小心,最终会出现大量的并发错误和/或瓶颈。

    链接地址: http://www.djcxy.com/p/8845.html

    上一篇: Java: when to use static methods

    下一篇: What is the best online resource for 3D rendering in JavaScript?