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

时间:2011-08-29 19:21:54

标签: java coding-style static

假设我有这样一个类:

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){

6 个答案:

答案 0 :(得分:18)

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

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

使用static可能会产生性能差异,但是如果它被内联则不太可能,因为它不会被调用太多。

static非常有用,因为它可以清楚地表明您没有访问任何成员字段。在我将一个方法标记为静态但这会产生错误(因为它不应该使用成员字段)时,这已经为我找到了一些错误。

您可以通过设计获得创意,并添加可能有用的图层和复杂性,但我会遵循YANGI原则并说您不太可能想要更改千米转换为里程的方式,或者如果你确实改变它,你不可能想要一种方法来做它。

答案 3 :(得分:4)

所有此类方法的明确 NO

例如,这样的方法仅在其参数上计算结果(返回值)是完全合法的,并且作者希望允许其他人更改子类中的计算。 (这是某种模板方法模式。) - 只有当它们不是静态时才能覆盖类。

顺便说一句:如果你改变了你的问题并只询问私人方法,那么我就不能这么说了。但是你问了各种各样的方法。

答案 4 :(得分:2)

是肯定的。尽可能使用静态方法。

答案 5 :(得分:1)

private static double convertToMiles(double km){}

这对于您的程序代码是正确的,因为convertToMiles()方法与实例变量无关。

但请记住,这个方法在非静态成员的其他类中是不可重用的,如果是,那么静态的目的就不会服务,因为静态可以避免多个对象的创建和内存浪费。