【问题标题】:Why is it better to use class name instead of objects to access class methods or variables in Java?为什么使用类名而不是对象来访问 Java 中的类方法或变量更好?
【发布时间】:2012-06-28 12:52:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能给我们一个首选方法与基于对象方法的代码示例吗?

标签: java static-methods static-members


【解决方案1】:

我假设你的类变量是指静态变量。

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

Thread.sleep,这是一个静态方法:

Thread.sleep(1000);

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

现在如果我们这样做:

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

现在哪个线程进入休眠状态?当前的“显然”。不了解 sleep 工作原理的人可能会认为子线程以某种方式进入睡眠状态。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 当然,因为你不能从 Class 访问非静态变量
    • 没错,我知道这听起来比我想象的要糟糕得多。我的意思是非静态的,当然使用对象。对不起!
    【解决方案3】:

    在生成的字节码方面没有任何不同,因此性能不是问题。

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        这是因为。

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

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

        【讨论】:

          猜你喜欢
          • 2014-08-21
          • 1970-01-01
          • 2013-03-01
          • 1970-01-01
          • 2015-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-01
          相关资源
          最近更新 更多