是否应将所有不使用实例变量的方法标记为静态

2022-09-01 12:05:50

假设我有一个这样的类:

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;
    }   
}

您可以看到:convertToMiles

  • 不使用任何实例变量
  • 仅在类内部使用

是否应将其声明为静态?这根本不会更改函数的功能(见上文)。我认为它可能会影响:

  • 可读性
  • 性能
  • 其他?

该函数应如下所示:convertToMiles

    private double convertToMiles(double km){

    private static double convertToMiles(double km){

答案 1

为了最大限度地提高风格卫生,是的,不使用任何对象状态但仅在对象内部有意义的私有方法应该是静态的。

这是指示它们如何操作的最清晰(也是最严格)的方法,它将有助于迫使您围绕方法边界进行设计时要小心,如果您决定稍后更改其中一个以使用对象数据,请三思而后行。

FWIW,我不怀疑这里存在相关的性能影响(从理论上讲,由于没有隐式引用,静态更容易调用)。此外,你可以在代码库中对此严格要求,但这肯定是一个合理的目标。this

注意:公共方法在将其标记为静态之前需要更多考虑;这些不能在不影响呼叫者的情况下改变,因此“默认为紧密”并不总是正确的选择。


答案 2

如果你问自己这个问题,他们的设计已经摇摇欲坠了。您应该从类中剔除所有这些“静态”函数,并将它们放在一个通用的、可重用的算法容器静态类中。

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


推荐