通过对象调用静态方法是否为“不良形式”?为什么?

2022-09-02 05:03:10

在最近的一个问题中,有人问及静态方法,其中一个答案说你通常用类似的东西来称呼它们:

MyClassName.myStaticMethod();

对此的评论还指出,您也可以通过具有以下条件的对象来调用它:

MyClassName myVar;
myVar.myStaticMethod();

但它被认为是糟糕的形式。

现在在我看来,这样做实际上可以让我的生活更轻松,所以我不必担心什么是静态的,什么不是(a)。

通过对象调用静态函数是否存在问题?显然,您不想创建一个全新的对象来调用它:

Integer xyzzy;
int plugh = xyzzy.parseInt ("42", 10);

但是,如果您已经有所需类型的对象,那么使用它是否存在问题?


(a)显然,我不能用以下方式调用非静态方法:

MyClassName.myNonStaticMethod();

但这不是我在这里要问的问题。


答案 1

在我看来,使这变得如此不可读的真正用例是这样的。下面的代码打印什么?

//in a main method somewhere
Super instance = new Sub();
instance.method();

//...
public class Super {
    public static void method() {
        System.out.println("Super");
    }
}

public class Sub extends Super {
    public static void method() {
        System.out.println("Sub");
    }
}

答案是它打印“超级”,因为静态方法不是虚拟的。即使 is-a,编译器也只能使用变量的类型。。但是,通过通过而不是 调用该方法,您巧妙地暗示它将是虚拟的。instanceSubSuperinstanceSuper

实际上,阅读 的开发人员必须查看该方法的声明(其签名)才能知道它实际上被调用了哪个方法。你提到instance.method()

在我看来,这样做实际上可以让我的生活更轻松,所以我不必担心什么是静态的或不静态的。

但在上面的情况下,上下文实际上非常重要!

我可以相当自信地说,语言设计师首先允许这样做是一个错误。远离。


答案 2

错误的形式注释来自Java的编码约定

查看 http://www.oracle.com/technetwork/java/codeconventions-137265.html#587

如果你仔细想想,它的原因是,该方法是静态的,不属于任何特定的对象。因为它属于该类,为什么还要将特定对象提升到如此特殊的状态,以至于它似乎拥有一个方法?

在您的特定示例中,您可以使用一个现有的整数来调用(也就是说,它在Java中是合法的),但这会使读者的注意力集中在该特定的整数对象上。读者可能会感到困惑,因此指导是避免这种风格。parseInt

关于这让你的生活更轻松程序员,把它转过来,问问是什么让读者的生活更轻松?有两种方法:实例方法和静态方法。当您看到一个表达式并且您知道是一个类时,您知道必须是一个静态方法。当您看到(实例在哪里)时,您无法分辨,但它看起来像一个实例方法,因此大多数人仅将此语法保留为实例方法。C.mCmx.mx


推荐