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

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


当前回答

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

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

其他回答

如果没有静态修饰符,你就不可能知道这个方法是无状态的,除非你在(重新)编写方法时进行额外的分析。 那么“静态”修饰符可能会给你一些关于重构的想法,而不是其他人认为无用的东西。 例如,将方法移动到某个Utility类或将其转换为成员方法。

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

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

public class Example {
   //...

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

   //...
}

静态/非静态问题归结为“我真的需要使用这个类的对象吗”?

你是在不同方法之间传递对象吗?对象是否包含在静态方法上下文之外有用的信息?如果两种方法都要使用,有没有理由不同时定义方法呢?

如果您陷入这种困境,在我看来,方法所需的所有数据都在对象之外的代码中浮动。这是你想要的吗?每次都将数据收集到一个对象中会更容易吗?您可能只是对使用单一模型感到矛盾。如果你可以用一种方法来完成,那就选择静态或非静态的方法。

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

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

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

一个原因是,在其他条件相同的情况下,静态方法调用应该更快。静态方法不能是虚方法,也不接受隐式this引用。