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

奇怪的Java编码风格——为什么?,java,coding-style,Java,Coding Style,我刚刚遇到了一些有点奇怪的代码,我想知道是否有人能解释为什么会这样写 我认为这与并发性有关——因此,如果另一个线程访问它,变量就不会被更改(因为变量更新不是原子的)。或者是速度(因为局部变量比类级变量快?) 哦,我不是说匈牙利符号,我是说方法中的局部赋值 public Class Space { private double m_dWidth = 0; // Constructors & other methods omitted for readability //...

我刚刚遇到了一些有点奇怪的代码,我想知道是否有人能解释为什么会这样写

我认为这与并发性有关——因此,如果另一个线程访问它,变量就不会被更改(因为变量更新不是原子的)。或者是速度(因为局部变量比类级变量快?)

哦,我不是说匈牙利符号,我是说方法中的局部赋值

public Class Space
{
  private double m_dWidth = 0;

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

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

似乎编写代码的人误解了
return
的工作原理。我的java学生(大学一年级)普遍误解为
return
只适用于本地定义的变量,而不是任意表达式


正如@Steve所暗示的,这也可能是旧版本、更复杂版本代码的遗留问题。哪个更可能取决于您在哪里找到代码。

这与您所写的内容无关。想想这段代码:

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
是一个成员变量,可以在类中的任何位置访问它


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

它应该在没有局部变量的情况下编写。getter中的局部变量是无用的

  public double getWidth()
  {
     return m_dWidth;
  }

我只能想到将实例变量复制到局部变量有意义的两种情况:

  • 如果
    m_dWidth
    是易变的,甚至是最终的,并且您在一个方法中多次使用它,那么获取本地副本可能会提高性能(有丢失更新的风险,这是可以接受的)——:

  • 在一些复杂的并发构造中,需要获取共享、非易失性变量的本地副本,以确保多线程上下文中的正确性:

    int h = hash;
    

在您给出的具体示例中,这没有什么区别(除了不必要地弄乱代码)。

这与编写此代码的人根本不应该编写代码这一事实有关,因为它毫无用处。我看到了一个问得很好的问题。我不理解否决票(特别是当否决票没有留下评论时)。这绝对没有任何作用,任何好的编译器都会对其进行优化。是的,似乎编写代码的人误解了return的工作原理。我的java学生(大学一年级)普遍误解return只对本地定义的变量有效。编辑:将此作为一个答案。我怀疑
getWidth
更复杂,并且已经被重构,这是一个遗留问题。对于这个代码示例,我想不出一个好的理由。谢谢,我也不知道为什么会投反对票。也许是因为他们相信自己比我强?奇怪的是,对于一个问答网站,我在问一个完美的问题时被否决了。嗯,不管怎样。。。您是对的,它是更复杂代码的一部分,但是,假设这是在多线程环境中使用的。如果另一个线程在与返回完全相同的时间修改了m_dWidth(即将其分配给局部变量),本地(旧)副本是否仍然会返回?@user114381否。当您有一个多线程应用程序时,您可以用另一种方式处理它。请参阅以更好地理解这一点。非常详细。非常感谢你。祝你有美好的一天。
int h = hash;