假设我有一个被设计为实例化的类。我在类中有几个私有的“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作为静态方法-或者有特别的理由不这样做?

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


当前回答

class Whatever {

    public static varType myVar = initializeClassVariable();

    private static varType initializeClassVariable() {

        //initialization code goes here
    }
}

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

其他回答

更具体地说,对于您给出的示例,定义这些方法的目的似乎更多是为了在阅读时使代码清晰,而不是为了实现功能(它们被定义为私有)。在这种情况下,使用静态确实没有任何用处,因为静态的目的是公开类的功能。

就像很多人说的那样,让它成为静态! 以下是我遵循的经验法则:如果你认为方法只是一个数学函数,即它是无状态的,不涉及任何实例变量(=> no blue color vars [in eclipse]在方法中),方法的结果将是相同的'n'次调用(当然,具有相同的参数),然后将该方法标记为STATIC。

如果你认为这个方法对其他类有用,那么把它移动到Util类中,否则,把这个方法作为私有的放在同一个类中。(尽量减少可达性)

正确答案是:

任何不从字段中获取任何信息,也不向字段中放入任何信息的方法都不必是实例方法。任何不使用或改变其类或对象中的任何字段的方法都可能是静态方法。

使用静态方法的一个问题是,它会使对象在单元测试中更难使用。Mockito不能为静态方法创建模拟,也不能创建该方法的子类实现。

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