1

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

例如:

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您会看到此类中有一个方法,即 is privatebut not static。将其标记为 是安全的static,但是有足够的理由这样做吗?

我有两个原因:

  1. 当我看到一个方法 is 时static,我知道它不会读/写实例变量,这使得代码更具可读性
  2. 更好的性能

但我不知道他们是否足以说服团队中的其他成员尽可能地改变他们的private方法。static

4

4 回答 4

2

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

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

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

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

归根结底,这是从一个程序员到下一个程序员的组织偏好。

静态与非静态方法没有显着的性能提升。如果已经创建了对象的实例,则不会有任何区别,并且创建对象与不创建对象并没有明显的性能增益。

于 2013-09-02T06:43:20.470 回答
1

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

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

没有必要乞求 FooDev 将他的方法设为静态,因为无论如何他是唯一一个调用它的人。

于 2013-09-02T06:41:08.960 回答
1

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

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

反正 ...

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

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

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

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

于 2013-09-02T07:32:43.117 回答
1

制作方法static向人类读者发出信号,表明该方法是无状态的,这是需要了解的一个重要方面。

除非要求无状态方法是实例方法(即非静态),例如因为类必须实现接口等,否则将无状态方法设为静态可能是一个很好的设计选择。

于 2013-09-02T06:50:04.157 回答