假设我有一个被设计为实例化的类。我在类中有几个私有的“helper”方法,它们不需要访问任何类成员,只对它们的参数进行操作,并返回一个结果。

public class Example {
   private Something member;

   public double compute() {
       double total = 0;
       total += computeOne(member);
       total += computeMore(member);
       return total;         
   }

   private double computeOne(Something arg) { ... }
   private double computeMore(Something arg) {... } 
} 

是否有特别的理由指定computeOne和computeMore作为静态方法-或者有特别的理由不这样做?

当然,让它们保持非静态状态是最简单的,尽管它们当然可以是静态的,而不会引起任何问题。


当前回答

我更喜欢这样的帮助方法是私有静态的;这将使读者清楚,他们不会修改对象的状态。我的IDE还将以斜体显示对静态方法的调用,因此我无需查看签名就知道该方法是静态的。

其他回答

我想澄清一些其他答案所说的事情,因为他们提供了我认为是错误的信息。

首先,因为方法是私有的,即使你声明它们是静态的,你也不能在这个类之外访问它们。其次,它们是私有的,所以你甚至不能在子类中重写,所以静态或非静态没有任何区别。第三,非静态的私有方法也可以从类的构造函数中调用,它不必是静态的。

现在回到您的问题,私有helper方法应该定义为静态还是非静态。我将采用Steve的回答,因为将私有方法标记为静态表明该方法是无状态的,因为我在编码时也遵循这一规则。

在这种情况下,我倾向于让computeOne和computeMore成为静态方法。原因是:封装。访问类实现的代码越少越好。

在您给出的示例中,您指出computeone和computeMore不应该访问类的内部,那么为什么要给类的维护者干涉内部的机会呢?

如果该方法基本上只是一个子例程,永远不会使用状态信息,则将其声明为静态。

这允许它在其他静态方法或类初始化中使用,即:

public class Example {
   //...

   //Only possible if computeOne is static
   public final static double COMPUTED_ONE = computeOne(new Something("1"));

   //...
}
class Whatever {

    public static varType myVar = initializeClassVariable();

    private static varType initializeClassVariable() {

        //initialization code goes here
    }
}

私有静态方法的优点是,如果稍后需要重新初始化类变量,可以重用它们。

跑题:我会把辅助方法放在一个独立的实用程序/辅助类中,其中只有静态方法。

在使用点(阅读为“相同的类”)拥有帮助方法的麻烦在于,某些人可能会选择将他们自己不相关的帮助方法发布在相同的位置