Java 构造函数和简单 setter 中参数命名的最佳实践

2022-08-31 23:56:47

对于 Java 中的参数,对于简单的构造函数和 setter,是否有一个标准可接受的约定?

(我已经看到了C++的答案,但两个社区之间的实践往往不同)

假设我有一个带有 foo 字段的 C 类。

我通常看到以下三个选项:

1) 使用带下划线的实际字段名称:

public C(Type foo_)
{
   foo = foo_;
}

public void setFoo(Type foo_)
{
   foo = foo_;
}

2)使用实际的字段名称,只需在设置中使用“this”:

public C(Type foo)
{
   this.foo = foo;
}
public void setFoo(Type foo)
{
   this.foo = foo;
}

3)完全不一致的东西,比如:

public C(Type bar)
{
   this.foo = bar;
}
public void setFoo(Type bar)
{
   this.foo = bar;
}

我倾向于使用2,但我想知道什么是正确的做法。


答案 1

选项二是最常见的。在Java中,使用无意义的名称前缀或后缀来区分实例变量与参数和局部变量被认为是不好的做法。但是名称本身没有约定。使用任何使代码最容易理解的名称。


答案 2

我也看到选项2是最常见的选项:

int importance;

public int getImportance()
{
    return importance;
}

public void setFoo(int importance)
{
    this.importance = importance;
}

Eclipse 和 Netbeans 等 IDE 将自动以上述格式编写 getter 和 setter。

使用此方法有一些优点:

字段名称中不使用下划线 (_) 字符 -- 不建议对非常量字段名称使用下划线。

不建议在标识符中使用下划线字符,但常量的标识符除外。

Java 教程的“变量”页面提到了以下有关下划线的内容:

如果变量存储一个常量值(如 ),则约定会稍有变化,将每个字母大写并用下划线字符分隔后续单词。按照惯例,下划线字符从不在其他地方使用。static final intNUM_GEARS = 6

(着重号是后加的。

由于字段名称不是常量,因此根据该页上所写的内容,不应在非常量字段中使用下划线。

IDE可以根据方法的参数名称自动添加Javadoc注释,因此在参数列表中具有字段名称将是有益的。

以下是自动生成的 Javadoc 的示例:

/**
 *
 * @param importance  <-- Parameter name in Javadoc matches
 *                        the parameter name in the code.
 */
public void setImportance(int importance)
{
    this.importance = importance;
}

让 Javadoc 反映字段名称还有另一个好处 -- 具有代码完成的 IDE 可以使用 Javadoc 中的字段名称来自动填写参数名称:

// Code completion gives the following:
this.getImportance(importance);

赋予字段名称和参数名称以含义将更容易理解参数实际表示的内容。

这些是我目前能想到的一些优点,我相信这很可能是Java中命名参数的最常见方法。


推荐