如何避免本地声明隐藏更高级别的声明



我正在阅读Java代码约定PDF,我注意到了这一点:

避免在更高级别隐藏声明的本地声明。为 例如,不要在内部块中声明相同的变量名:

int count;
         ...
         func() {
             if (condition) {
                 int count;
... }
... }

这并不是什么新鲜事,我经常发现自己在写这样的代码。你如何解决这样的案件?当然,你可以说"找到一个更好的名字",但这并不总是那么容易。在更高级别名称的前面或后面添加内容是否有任何约定?

可以使用特定于范围的变量命名约定来减少混淆。

String[] names;
public void populateNames(String[] theNames) {
    names = theNames;
}

此外,还可以使用 this 关键字显式声明所需的作用域变量。

int count = 0;
public void func() {
    int count = 0;
    if (condition) {
        this.count++; // increment the class-scope count variable
    } else {
        count++; // increment the local scope variable
    }
}

一般来说,只是不要重复使用你的变量名称。 它使那些读取代码的人感到困惑,并使调试变得更加困难。

int count;
count = 1;

int count;
this.count = 1;

因此,如果您使用局部变量,则不会使用"this"。

顶级变量具有比较低变量更"详细"的名称。例如:

class A{
    private int mVegetablesCount;
    public void foo(){
        int count;
        if(true){
           int cnt;
             if(true)
                int c;
        }
    }
}

就像变种一样。此外,最好专门命名您的类字段。在我的示例字段中,名为第五个前缀"m"。

如果只处理方法变量声明,则可以使用 this 关键字来引用实例变量,如以下示例所示:

public class Foo {
    private int id;
    public void setId(int id) {
        this.id = id;
    }
}

在这里,this.id 是指实例变量,而id是指传递给 setter 的参数。

我知道你说过你不想

听到使用更好的变量名称的建议,但我确实认为你真正应该有重复名称的唯一情况是当你准备为 ivar 设置一个新值时,或者刚刚阅读一个 ivar。即便如此,使用具有更多含义的名称通常更具可读性,因此例如,如果您只需要一个与临时barr相同的变量,请将其命名为 tmpBarr 或类似的东西。

我已经在库中看到过这种编码风格:

  • 成员变量:_variable
  • 局部变量:locVariable
  • 方法参数(参数):parVariable

但我个人认为它使代码混乱。

任何好的 IDE 都会使用颜色代码,该颜色代码在局部变量和类成员之间有明显的区别。

最新更新