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?