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

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


当前回答

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

其他回答

class Whatever {

    public static varType myVar = initializeClassVariable();

    private static varType initializeClassVariable() {

        //initialization code goes here
    }
}

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

我将它们声明为静态,从而将它们标记为无状态。

对于不能导出的小操作,Java没有更好的机制,所以我认为私有静态是可以接受的。

答案是……视情况而定。

如果member是特定于您正在处理的对象的实例变量,那么为什么要将它作为参数传递呢?

例如:

public class Example {
   private Something member;

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

   private double computeOne() { /* Process member here */ }
   private double computeMore() { /* Process member here */ } 
}

根据我的经验,我认为这种私有方法往往是相当通用和可重用的。

我认为要做的第一件事是问这个方法在当前类上下文之外是否有用。如果是这样,我将完全按照Everyone的建议,将这个方法作为静态提取到一些utils类,希望在实现新方法之前进行检查,做完全相同的事情。

这种通用的私有方法是项目中很大一部分代码重复的来源,因为每个开发人员都在需要使用它们的地方独立地重新发明它们。因此,这种方法的集中化是一条可行之路。

我实在想不出私有静态方法有什么明显的优势。话虽如此,使它们是非静态的也没有什么特别的好处。这主要是一个表示的问题:你可能想让它们是静态的,以清楚地强调它们没有改变对象的事实。

对于具有不同访问权限的方法,我认为有两个主要参数:

可以在不创建对象实例的情况下调用静态方法,这很有用 静态方法不能被继承,如果您需要多态性,这可能是一个问题(但与私有方法无关)。

除此之外,差异非常小,我强烈怀疑传递给实例方法的额外this指针会产生显著差异。