1

我正在从http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-137265.html#587阅读 Java 的代码约定。

在那里,他们提到我们应该避免使用对象来访问类变量或方法,而应该使用类名。

避免使用对象来访问类(静态)变量或方法。请改用类名。例如:

classMethod();             //OK 
AClass.classMethod();      //OK
anObject.classMethod();    //AVOID!

在条款或性能或其他方面是否有特殊原因?

4

5 回答 5

4

通过类变量,我假设您的意思是静态变量。

应避免通过实例变量使用静态变量/方法,因为这会使读者感到困惑。由于您只能使用实例来访问实例变量,因此阅读通过实例调用静态方法的代码可能会使读者对正在发生的事情感到困惑。

想象这个案例,用Thread.sleep,这是一个静态方法:

Thread.sleep(1000);

由于该方法是静态的,并且我们通过类名来调用它,因此读者可以直观地推断出效果是使当前线程进入休眠状态。

现在,如果我们这样做:

Thread t = new Thread(...);
t.sleep(1000);

现在哪个线程进入睡眠状态?当前的“显然”。不知道睡眠如何工作的人可能会认为子线程以某种方式进入睡眠状态。

于 2012-06-28T12:57:54.977 回答
3

我想这取决于你想做什么。我总是使用类名来访问一个静态变量。作为静态,你这样做的方式并不重要,但我确实节省了一些内存使用量。

至于非静态变量,请始终使用对象。

于 2012-06-28T12:55:43.957 回答
3

就生成的字节码而言,它没有任何不同,因此性能不是问题。

问题是使用变量访问静态成员看起来好像变量持有的引用实际上对访问的内容很重要。但事实并非如此!事实上即使在anObject哪里null,你也不会得到一个NPE,但它只会调用classMethod

所以原理很简单:访问静态成员时,避免提及实际上与所进行的访问无关的信息(在本例中为变量名)。

于 2012-06-28T12:59:16.193 回答
1

我不了解性能,但如果您将其与类名一起使用,显然另一个查看您的代码的开发人员乍一看就会知道它是一个静态变量/方法。

我不认为编译器会使用变量给出不同的代码。

于 2012-06-28T12:56:52.137 回答
1

这是因为。

1.它告诉变量或方法实际上是一个静态的。

2.此外,它检查对象引用哪个类。这会产生额外的费用。

于 2012-06-28T12:56:57.257 回答