我正在从http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-137265.html#587阅读Java的代码约定。
在这方面,他们提到我们应该避免使用对象来访问类变量或方法,而应该使用类名。
避免使用对象访问类(静态)变量或方法。 请改用类名。例如:
classMethod(); //OK AClass.classMethod(); //OK anObject.classMethod(); //AVOID!
在术语或表现方面还有其他特殊原因吗?
答案 0 :(得分:4)
通过类变量,我假设你的意思是静态变量。
应该避免通过实例变量使用静态变量/方法,因为它会让读者感到困惑。由于您只能使用实例来访问实例变量,因此读取通过实例调用静态方法的代码可能会使读者混淆正在发生的事情。
使用Thread.sleep
创建这种情况,这是一种静态方法:
Thread.sleep(1000);
由于该方法是静态的,我们通过类名调用它,因此读者可以直观地推断出效果是将当前线程置于休眠状态。
现在,如果我们这样做了:
Thread t = new Thread(...);
t.sleep(1000);
现在哪个线程进入睡眠状态?目前的一个“明显”。不知道睡眠如何工作的人可能会认为子线程以某种方式进入睡眠状态。
答案 1 :(得分:3)
在生成的字节码方面没有任何不同,因此性能不是问题。
的问题是,使用变量访问静态成员看起来好像变量所持有的引用实际上与访问的内容有关。但事实并非如此!事实上,即使anObject
null
,{em> <{1}},但它只会调用NPE
。
因此原则很简单:访问静态成员时,请避免提及实际与正在进行的访问无关的信息(在本例中为变量名称)。
答案 2 :(得分:2)
我想这取决于你想做什么。我总是使用类名来访问一个静态变量。静态它与你的方式无关,但我确实节省了一些内存使用。
对于非静态变量,请始终使用对象。
答案 3 :(得分:1)
我不了解性能,但很明显,如果您将其与类名一起使用,另一位正在查看代码的开发人员将首先知道它是一个静态变量/方法。
我认为编译器不会使用变量给出不同的代码。
答案 4 :(得分:1)
这是因为。
1.它告诉变量或方法实际上是静态的。
2.另外,它检查对象是指哪个类。这需要额外的费用。