我们应该尽可能地将私有方法标记为“静态”吗?

时间:2013-09-02 06:37:17

标签: java static private

类中有一些私有方法,它们不依赖于任何实例变量。他们接受一些论点,并返回一个值,没有副作用。

例如:

class User {
    private String firstName;
    private String lastName;
    public String getFullName() {
          return capWord(firstName) + " " + capWord(lastName);
    }
    private String capWord(String word) {
         return word.substring(0,1).toUpperCase() + word.substring(1);
    }
}

您看到此类中有capWord方法,private但不是static。将其标记为static是安全的,但有足够的理由这样做吗?

我有两个理由:

  1. 当我看到一个方法是static时,我知道它不会读/写实例变量,这会使代码更具可读性
  2. 更好的表现
  3. 但我不知道他们是否足以说服团队中的其他成员尽可能将private方法更改为static

4 个答案:

答案 0 :(得分:2)

这似乎不是一个问题,而是更多的意见。

尽可能保持中立,Java在其模型中非常面向对象。使用“实用程序”方法可以为多个定义为静态的实例提供服务,这是一种非常有效的方法。

非静态方法更像是一种面向对象的方法,它取决于是否有一个实例调用该方法是有意义的。

例如,我可能有一个Launcher类,它提供了几种影响我程序的实用方法,但我可能只希望有一个Thread来控制这些方法。因此,我创建了一个Launcher类的实例来访问它的方法,并使用静态方法来检索Launcher上的锁。

最终,这是从一个程序员到下一个程序员的组织偏好。

静态和非静态方法没有显着的性能提升。如果已经创建了一个对象的实例,它将没有任何区别,并且创建一个对象而不是没有可感知的性能增益。

答案 1 :(得分:1)

就个人而言,我会将其标记为静态,但它不是一种极端的性能优势,而且更具组织性。如果你使用静态更好地工作,请将其设置为静态。如果你最好还是一个实例方法,无论如何都要这样做。它被标记为私有,因此您可以自由地做任何您需要/喜欢做的事情来使其发挥作用。

虽然在适当的时候将私有方法标记为静态当然是可以接受的,但是没有必要试图说服其他人这样做。设计私有方法,以便其他人的私人方法在这里不需要关注你,就像你的情况一样。

没有必要求FooDev让他的方法保持静态,因为他是唯一一个调用它的方法。

答案 2 :(得分:1)

使方法static向人类读者发出信号,告知该方法为stateless,这是一个需要了解的重要方面。

除非需要无状态方法是一个实例方法(即非静态),例如因为类必须满足接口等,所以制作无状态方法可能是一个很好的设计选择静态的。

答案 3 :(得分:1)

您提出了两个原因来声明static这样的方法。

你的第一个理由是有效的,或多或少。 (它实际上说的不仅仅是你说的。一个static方法也不能显式或隐式地调用实例方法!但它可能对作为参数传递的对象有副作用,可以通过其他静态方法访问,等等。)。

无论如何......

  • 如果将方法声明为static以声明它不依赖于目标对象的状态,则可以提高可读性。但是,对于这种典型的小型私有“帮助”方法,很明显该方法不依赖于实例变量。

  • 另一方面,当您将方法声明为static时,您将被约束。对于private方法,该约束已本地化为当前类...并且易于修改。但对于非私有方法,约束可能会影响其他类并导致问题。

你的第二个原因值得商榷。如果所讨论的方法很小,那么很可能由JIT编译器内联,这将否定任何潜在的性能优势。即使有性能优势,它也可能是调用序列中的一个或两个指令,与应用程序的整体性能相比,这可能是微不足道的。

总之,我认为声明私有方法static的“案例”相对较弱。这不值得你的同事纠缠于...... IMO。