如果我用Java创建一个类的实例,为什么最好静态地调用同一个类的静态方法,而不是使用this.method()?
当我尝试通过this.staticMethod()从自定义类的构造函数中调用静态方法staticMethod()时,我收到Eclipse的警告.
public MyClass() { this.staticMethod(); }
Run Code Online (Sandbox Code Playgroud)
VS
public MyClass() { MyClass.staticMethod(); }
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么这是一件坏事吗?在我看来,编译器应该已经分配了一个对象的实例,因此静态分配内存将是不必要的开销.
编辑:
我听到的要点是,这是不好的做法,主要是因为可读性,这是可以理解的.我真正想要问的是(尽管不是很清楚)在调用MyClass.staticMethod()或this.staticMethod()之间的"编译"(如果有的话)有什么不同.
MyClass.staticMethod()清楚地表明您正在调用静态(不可重写)方法.
this.staticMethod()误导读者认为它是一个实例方法.
staticMethod()也在误导方面(虽然我通常这样做).
如果您认为人们在阅读您的代码时不熟悉它,您倾向于尝试使代码更清晰,这是通过使用ClassName.method而不是instance.method来更清楚代码的情况.
除了已经提到的其他答案明确表示你正在使用静态方法之外,还要注意静态方法不是多态的,因此使用类名显式可以消除关于将要调用哪个方法的任何混淆.
在下面的代码中,b.test()
如果您期望非静态方法的多态性,则返回"A" 并不完全明显:
public class TestStaticOverride
{
public static void main( String[] args )
{
A b = new B();
System.out.println( "Calling b.test(): " + b.test() );
}
private static class A
{
public static String test() { return "A"; }
}
private static class B extends A
{
public static String test() { return "B"; }
}
}
Run Code Online (Sandbox Code Playgroud)
如果您将代码更改为B b = new B();
它将打印出"B".
("覆盖"静态方法是否一个好主意可能是另一天的讨论...)