是否所有不使用实例变量的方法都应标记为static

six*_*ude 28 java static coding-style

假设我有一个这样的类:

public class Car {

    private double distanceDriven;

    public void drive(double miles){
        distanceDriven += miles;
    }

    public void driveInCanada(double kilometer){
        distanceDriven += convertToMiles(kilometer);
    }

    private double convertToMiles(double km){
        return km*0.621371192;
    }   
}
Run Code Online (Sandbox Code Playgroud)

你可以看到convertToMiles:

  • 不使用任何实例变量
  • 只在课堂内使用

它应该被声明为静态吗?这根本不会改变函数的功能(见上文).我认为它可能会影响:

  • 可读性
  • 性能
  • 其他?

convertToMiles功能应该是这样的:

    private double convertToMiles(double km){
Run Code Online (Sandbox Code Playgroud)

要么

    private static double convertToMiles(double km){
Run Code Online (Sandbox Code Playgroud)

Ben*_*tto 18

为了获得最大的风格卫生,​​是的,不使用任何对象状态但仅在对象内部有意义的私有方法应该是静态的.

这是表明它们如何操作的最清晰(也是最严格)的方式,它将有助于您在方法边界上小心设计,并且如果您决定稍后更改其中一个以使用对象数据,请三思而后行.

FWIW,我不怀疑这里有相关的性能影响(理论上静态更容易调用,因为没有隐式this引用).此外,你可以在你的代码库中严格要求这一点,但这当然是一个合理的目标.

NB公共方法在将其标记为静态之前需要更多考虑; 那些不能在不影响呼叫者的情况下改变,所以"默认为紧张"并不总是正确的选择.


Bli*_*ndy 6

如果你问自己这个问题,那么你的设计已经不稳定了.你应该将所有那些"静态"函数从类中删除,并将它们放在一个通用的,可重用的算法容器静态类中.

看看你的代码,convertToMiles与汽车有什么关系?这是一种可以在多个函数中重用的通用算法.