奇怪的Java编码风格 - 为什么?

3
我刚刚遇到一些代码,有点奇怪。我想知道为什么会这样写。我认为这可能与并发有关,以防其他线程访问它时变量被更改(因为变量更新不是原子的)。或者加快速度(因为局部变量比类级别变量更快?)或者我在这里写的一切都是错的:)
哦,我说的不是匈牙利语法,我说的是方法内的局部赋值。
public Class Space
{
  private double m_dWidth = 0;

  // Constructors & other methods omitted for readability
  //...

  public double getWidth()
  {
     double dWidth = m_dWidth;
     return dWidth;
  }
}

7
这与编写此代码的人根本不应该写代码有关,因为它完全没有任何用处。 - Nikola Yovchev
2
我看到一个很好的问题。我不理解为什么要点踩(尤其是当点踩者没有留下评论时)。 - Maroun
2
那完全没有作用,任何好的编译器都会优化掉它。 - dtech
1
是的,看起来编写代码的人误解了return的工作方式。这是我Java学生(大一)中常见的误解,即return仅适用于本地定义的变量。 - evilcandybag
2
我认为getWidth更加复杂,并且已经进行了重构,这可能是剩下的遗留问题。我无法想到这段代码示例有什么好的理由。 - Steve
显示剩余3条评论
4个回答

3

看起来编写代码的人误解了return的工作原理。这是我在教授Java课程时发现的学生们常见的误解(大一的大学生)。实际上return适用于任意表达式而不仅仅是局部定义的变量。

正如@Steve所建议的,这也可能是旧版本代码中的剩余问题。哪一个更有可能取决于你在哪里找到这个代码。


2
我只能想到两种情况,将实例变量复制到局部变量可能有意义:
  • if m_dWidth is volatile or even final and you use it more than once in a method, taking a local copy may improve performance (with the risk of missing updates, which may be acceptable) - example in ArrayBlockingQueue#extract:

    final Object[] items = this.items;
    
  • in some complex concurrent constructs, such as String#hashcode, where taking a local copy of a shared, non volatile, variable is necessary to ensure correctness in a multithreaded context:

    int h = hash;
    
在你提供的具体示例中,这并没有什么区别(除了使代码变得混乱无序)。

0

这与你所写的任何内容都没有关系。想想这段代码:

class MyClass {
     private int myInt;

     //...

     public int getData() {
         return myInt;
     }

     public int strangeGetData() {
         int temp = myInt;
         return temp;
     }

     public int strangeGetData2() {
         int temp = myInt;
         int temp2 = temp;
         int temp3 = temp2;
         return temp3;
     }
}

当您使用任何一个getter时,您将获得相同的结果。请注意,myInt是一个成员变量,它可以在类的任何地方访问。

我建议您通过教程更好地理解这一点。


谢谢,我也不知道为什么会被踩。也许是因为他们认为自己比我更优秀?在一个问答网站上,我提出了一个完美的问题却被踩,这很奇怪。嗯......无论如何,你说得对,这是更复杂的代码的一部分,但是请假设它将在多线程环境中使用。如果另一个线程恰好在返回时修改了m_dWidth,那么将其赋值给本地变量,旧的本地副本是否仍将被返回? - user114381
@user114381 不是的。当你有一个多线程应用程序时,你需要以另一种方式处理它。请参考文档以更好地理解这一点。 - Maroun
非常详细。非常感谢。祝您有美好的一天。 - user114381

0

应该不使用局部变量来编写。在getter中使用局部变量是无用的。

  public double getWidth()
  {
     return m_dWidth;
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接