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

时间:2013-12-14 12:31:48

标签: java coding-style

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

认为它与并发有关 - 所以如果另一个线程访问变量,变量就不会被改变(因为变量更新不是原子的)。 它的速度(因为局部变量比类级变量快?) OR 我在这里写的所有内容都错了:)

哦,我不是在谈论匈牙利语,我在谈论方法中的本地任务。

public Class Space
{
  private double m_dWidth = 0;

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

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

4 个答案:

答案 0 :(得分:3)

看起来编写代码的人误解了return的工作原理。在我的java学生(大学第一年)中,return仅适用于本地定义的变量而不是任意表达式,这是一个常见的误解。

正如@Steve建议的那样,它也可能是旧代的,更复杂的代码版本的宿醉。哪一个更可能取决于您找到代码的位置。

答案 1 :(得分:2)

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

  • 如果m_dWidth是易变的,甚至是最终的,并且您在方法中多次使用它,则采用本地副本可能会提高性能(存在丢失更新的风险,这可能是可以接受的) - { {3}}:

    final Object[] items = this.items;
    
  • 在一些复杂的并发结构中example in ArrayBlockingQueue#extract,其中需要获取共享的非易失性变量的本地副本以确保多线程上下文中的正确性:

    int h = hash;
    

在您给出的具体示例中,它没有任何区别(除了不必要地使代码混乱)。

答案 2 :(得分: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;
     }
}

当您使用任何 getters 时,您将获得相同的结果。请注意,myInt成员变量,可以在类中的任何位置访问它。

我建议你通过tutorial来更好地理解这一点。

答案 3 :(得分:0)

它应该写成没有局部变量。 getter中的局部变量是无用的。

  public double getWidth()
  {
     return m_dWidth;
  }