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