类中有一些私有方法,它们不依赖于任何实例变量。他们接受一些论点,并返回一个值,没有副作用。
例如:
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
是安全的,但有足够的理由这样做吗?
我有两个理由:
static
时,我知道它不会读/写实例变量,这会使代码更具可读性但我不知道他们是否足以说服团队中的其他成员尽可能将private
方法更改为static
。
答案 0 :(得分:2)
这似乎不是一个问题,而是更多的意见。
尽可能保持中立,Java在其模型中非常面向对象。使用“实用程序”方法可以为多个定义为静态的实例提供服务,这是一种非常有效的方法。
非静态方法更像是一种面向对象的方法,它取决于是否有一个实例调用该方法是有意义的。
例如,我可能有一个Launcher
类,它提供了几种影响我程序的实用方法,但我可能只希望有一个Thread
来控制这些方法。因此,我创建了一个Launcher
类的实例来访问它的方法,并使用静态方法来检索Launcher
上的锁。
最终,这是从一个程序员到下一个程序员的组织偏好。
静态和非静态方法没有显着的性能提升。如果已经创建了一个对象的实例,它将没有任何区别,并且创建一个对象而不是没有可感知的性能增益。
答案 1 :(得分:1)
就个人而言,我会将其标记为静态,但它不是一种极端的性能优势,而且更具组织性。如果你使用静态更好地工作,请将其设置为静态。如果你最好还是一个实例方法,无论如何都要这样做。它被标记为私有,因此您可以自由地做任何您需要/喜欢做的事情来使其发挥作用。
虽然在适当的时候将私有方法标记为静态当然是可以接受的,但是没有必要试图说服其他人这样做。设计私有方法,以便其他人的私人方法在这里不需要关注你,就像你的情况一样。
没有必要求FooDev让他的方法保持静态,因为他是唯一一个调用它的方法。
答案 2 :(得分:1)
使方法static
向人类读者发出信号,告知该方法为stateless,这是一个需要了解的重要方面。
除非需要无状态方法是一个实例方法(即非静态),例如因为类必须满足接口等,所以制作无状态方法可能是一个很好的设计选择静态的。
答案 3 :(得分:1)
您提出了两个原因来声明static
这样的方法。
你的第一个理由是有效的,或多或少。 (它实际上说的不仅仅是你说的。一个static
方法也不能显式或隐式地调用实例方法!但它可能对作为参数传递的对象有副作用,可以通过其他静态方法访问,等等。)。
无论如何......
如果将方法声明为static
以声明它不依赖于目标对象的状态,则可以提高可读性。但是,对于这种典型的小型私有“帮助”方法,很明显该方法不依赖于实例变量。
另一方面,当您将方法声明为static
时,您将被约束。对于private
方法,该约束已本地化为当前类...并且易于修改。但对于非私有方法,约束可能会影响其他类并导致问题。
你的第二个原因值得商榷。如果所讨论的方法很小,那么很可能由JIT编译器内联,这将否定任何潜在的性能优势。即使有性能优势,它也可能是调用序列中的一个或两个指令,与应用程序的整体性能相比,这可能是微不足道的。
总之,我认为声明私有方法static
的“案例”相对较弱。这不值得你的同事纠缠于...... IMO。