我想知道何时使用静态方法?假设我有一个带有几个 getter 和 setter 的类,一个或两个方法,我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法?
例如
Obj x = new Obj();
x.someMethod
要么
Obj.someMethod
(这是静态方式吗?)
我很困惑!
一个经验法则:问问自己 “即使没有构建 Obj,这个方法也有意义吗?” 如果是这样,那肯定是静态的。
因此在类Car
你可能有一个方法double convertMpgToKpl(double mpg)
,这将是静态的,因为人们可能想知道 35mpg 转换为什么,即使没有人建造过汽车。但是void setMileage(double mpg)
(设置一个特定 Car 的效率)不能是静态的,因为在构造任何 Car 之前调用该方法是不可思议的。
(顺便说一下,反过来并不总是这样:你有时会有一个方法涉及两个Car
对象,但仍然希望它是静态的。例如Car theMoreEfficientOf( Car c1, Car c2 )
。虽然这可以转换为非 - static 版本,有人会争辩说,由于没有 “特权” 选择哪个 Car 更重要,你不应该强迫调用者选择一个 Car 作为你将调用该方法的对象。这种情况说明但是,对于所有静态方法的一小部分。)
仅在以下方案中定义静态方法:
使用静态方法有一些正当理由:
性能 :如果您希望运行某些代码,并且不希望实例化额外的对象,请将其推送到静态方法中。 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 之前的版本) 。它从您的设计中获得了很大的灵活性。此外,如果你需要状态 ,如果你不小心,你最终会遇到很多并发错误和 / 或瓶颈。