使用私有静态方法

时间:2009-03-26 12:21:26

标签: java oop coding-style static-methods

您如何看待使用私有静态方法

就个人而言,我更喜欢使用静态私有方法来非静态,只要它不需要访问任何实例字段。

但我听说这种做法违反了OOP原则。

编辑:我想从风格的角度来看,而不是表现。

7 个答案:

答案 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)

私有或公共没有区别 - 静态方法是可以的,但如果你发现你一直在使用它们(当然,不访问任何实例字段的实例方法基本上都是静态方法)目的),那么你可能需要重新考虑设计。它并不总是可行,但大多数时候方法应该与它们操作的数据一起存在 - 这是OOP的基本思想。

答案 3 :(得分:2)

我不一定会看到你正在做的任何真正的问题,但我的第一个问题是,如果该方法不需要访问任何实例字段,那么它首先在该类中做了什么?

答案 4 :(得分:0)

这是一个品味问题,但我制作的方法不会对对象内的状态做出反应。这样,如果静态函数需要类似的功能,我就不必重写代码。排序功能就是这种情况的一个很好的例子。

答案 5 :(得分:0)

我倾向于不使用私有静态方法。我使用公共静态方法并将它们分组到Util类中以促进重用。

答案 6 :(得分:0)

私有静态方法可以例如对其类的私有静态成员进行操作。这可用于封装和统一某些特定于类的操作。

在我看来,使用静态方法的主要缺点是抛弃了覆盖的可能性。由于Java中的类不是,比如Smalltalk中的类,你不能覆盖静态方法。

由于您的问题与私有静态方法有关,因此无论如何都会超越选项。

我倾向于仅在实用程序类(如java.lang.Math)或类似Singleton模式的模式中使用静态方法。所有这些都需要比私人更高的可见性,因为它们代表了他们的班级为他人提供的服务。

最后的想法:如果您有一个或多个私有静态方法,请考虑将它们提取到专用的实用程序类并将它们公之于众。更好的是,使它们成为实例方法并使用Singleton模式。