您如何看待使用私有静态方法?
就个人而言,我更喜欢使用静态私有方法而不是非静态方法,只要它不需要访问任何实例字段。
但我听说这种做法违反了 OOP 原则。
编辑:我想从风格的角度来看,而不是性能。
您如何看待使用私有静态方法?
就个人而言,我更喜欢使用静态私有方法而不是非静态方法,只要它不需要访问任何实例字段。
但我听说这种做法违反了 OOP 原则。
编辑:我想从风格的角度来看,而不是性能。
一个private static
方法本身并不违反 OOP,但是当你在一个不需要(也不能*)访问实例字段的类上有很多这些方法时,你不是在以 OO 方式编程,因为“对象”意味着状态+对该状态一起定义的操作。如果它们不需要任何状态,为什么要将这些方法放在该类上?
(*) = 原则上,由于 Java 中的类级别可见性,类上的静态方法可以访问该类对象的实例字段,例如:
class Test
{
int field = 123;
private static void accessInstance(Test test)
{
System.out.println(test.field);
}
}
当然,您需要自己传递对实例(this
指针)的引用,但实际上您是在模仿实例方法。只是为了完整性而提到这一点。
如上所述,私有静态方法对于组织重用逻辑和减少/消除重复代码通常很有用。我很惊讶在这个讨论中我没有注意到任何关于性能的提及。来自 Renaud Waldura 的“决赛的最后一句话”:
(注意,私有静态方法是隐式最终的)
“由于 final 方法只在声明类中实现,因此无需动态调度对 final 方法的调用,而可以使用静态调用。编译器可以直接调用该方法,完全绕过通常的虚拟方法调用过程。因此,最终方法也是由即时编译器或类似优化工具内联的候选方法。(请记住,私有/静态方法已经是最终方法,因此始终考虑进行此优化。)
查看整篇论文: http ://renaud.waldura.com/doc/java/final-keyword.shtml
private 或 public 没有区别 - 静态方法是可以的,但如果你发现你一直在使用它们(当然,不访问任何实例字段的实例方法基本上是用于此目的的静态方法),那么您可能需要重新考虑设计。这并不总是可能的,但大多数时候方法应该与它们操作的数据一起存在 - 这是 OOP 的基本思想。
我不一定认为您正在做的事情有任何真正的问题,但我的第一个问题是,如果该方法不需要访问任何实例字段,那么它首先在该类中做了什么?
这是一个品味问题,但我制作的方法不会对对象内的静态状态做出反应。这样,如果静态函数需要类似的功能,我就不必重写代码。排序函数就是这种情况的一个很好的例子。
我倾向于不使用私有静态方法。我确实使用公共静态方法并将它们分组到 Util 类中以促进重用。
例如,私有静态方法可以对其类的私有静态成员进行操作。这可以用来封装和统一某些特定类的操作。
在我看来,使用静态方法的主要缺点是放弃了覆盖的可能性。由于 Java 中的类不像 Smalltalk 中的类,因此您不能覆盖静态方法。
由于您的问题与私有静态方法有关,因此无论如何都无法覆盖。
我倾向于仅在实用程序类(如 java.lang.Math)或单例模式等模式的情况下使用静态方法。所有这些都需要比私有更高的可见性,因为它们代表了他们的班级向其他人提供的服务。
最后的想法:如果您有一个或多个私有静态方法,请考虑将它们提取到专用的实用程序类并将它们公开。更好的是,让它们成为实例方法并使用单例模式。