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

Java构造函数和简单setter中参数命名的最佳实践,java,naming,Java,Naming,对于直接的构造函数和setter,Java中的参数是否有一个可接受的标准约定 (,但这两个社区的做法往往不同) 假设我有一个C类和一个foo字段 我通常看到以下三种选择: 1) 使用带下划线的实际字段名: 2) 使用实际字段名,只需在设置中使用“this”: 3) 完全不一致的事情,比如: 我倾向于使用2,但我想知道什么是正确的做法 我看到2和3使用得最多。也就是说,答案取决于您所贡献的代码库的公认标准。我认为在整个项目中保持一致比为每个java开发人员提供一个“正确”的答案更重要 Eclips

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

(,但这两个社区的做法往往不同)

假设我有一个C类和一个foo字段

我通常看到以下三种选择:

1) 使用带下划线的实际字段名: 2) 使用实际字段名,只需在设置中使用“this”: 3) 完全不一致的事情,比如:
我倾向于使用2,但我想知道什么是正确的做法

我看到2和3使用得最多。也就是说,答案取决于您所贡献的代码库的公认标准。我认为在整个项目中保持一致比为每个java开发人员提供一个“正确”的答案更重要


Eclipse代码生成使用列表中的样式#2。

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

我知道,当netbeans自动创建getter和setter时,它会使用数字2方法。我个人通常将temp添加到变量中,即
foo=tempfoo
。但正如尼什所说,无论你选择哪种方法,你都应该努力保持一致性(1)是非常C/C++。Java不太倾向于使用前导下划线

我个人几乎完全使用(2)


(3) 只是让您的生活变得困难,因为很难为成员和参数想出两个有意义但简洁的名称。

当您编写代码使界面尽可能清晰时,我总是喜欢在内部使用一个字段作为
\u name
,将其作为
name
作为方法参数,优雅地将其命名为
\u name=name
。我在Fowler的重构和其他类似的教科书中看到了这一点,尽管我看到了一些丑陋的机制,比如在内部使用字段作为
name
,然后使用
aName
作为方法参数,呃。

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

int importance;

public int getImportance()
{
    return importance;
}

public void setFoo(int importance)
{
    this.importance = importance;
}
Eclipse和Netbeans等IDE将自动以上述格式编写getter和setter

使用此方法有几个优点:

不在字段名中使用下划线(
\uuu
)字符-非常量字段名不建议使用下划线。

除了常数的标识符外,不建议在标识符中使用下划线字符

Java教程的页面提到以下关于下划线的内容:

如果变量存储常量 值,例如
static final int
NUM_GEARS=6
,约定更改 稍微,每个字母大写 并用 下划线字符By 约定,下划线字符 从未在其他地方使用过。

(重点加上。)

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

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

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

/**
 *
 * @param importance  <-- Parameter name in Javadoc matches
 *                        the parameter name in the code.
 */
public void setImportance(int importance)
{
    this.importance = importance;
}
赋予字段名和参数名含义将使您更容易理解参数实际代表的内容

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

选项二

如果您看到一个“setFoo(stringfoo)”定义(例如,在javadoc或hover中),您可以合理地预期字段“foo”被设置为参数“foo”的值。其他姓名可能需要您进行双重检查-例如,setName(字符串person)是否将姓名设置为person,或者是否会采取其他措施(在人员表中查找姓名等)

通常不这样做的原因是您可能会意外地写信

。。。 foo=foo

而不是

this.foo=foo

这是参数的自赋值,不做任何事情。现代编译器捕捉到了这一点——现代IDE在为字段创建setter时生成“this.foo=foo”语句


在Eclipse中,您可以为字段创建getter和setter,当光标位于相关字段上时,使用Ctrl-1;例如:

字符串m_foo

这样,很清楚哪些变量是成员,哪些不是成员

另外,我的上一家公司在方法中的所有参数前面加上了“the”,如下所示:

公共doFoo(字符串theKey,字符串theRandom){

}

这使得不将参数与内部变量混淆变得非常容易


约定应该是使代码更易于阅读,并减少错误。

选项2在Java中最常见,但挑剔的Checkstyle不允许您使用此选项,因为本地变量的名称会影响其他变量

因此,大多数人使用以下方法:

foo(intthatbar){
this.bar=thatBar;
}

使用此选项的唯一问题是,其他人可能会猜测您在类中使用的是名为bar的var,因为如果不是,您就不会这样命名参数

一个邪恶的人只有通过查看方法才能使用这些信息更好地理解您的类。
但为此,您将使用模糊器重命名所有变量等。

是选项2使用最广泛;尽管它有一个严重的问题:如果您在参数声明中有一个输入错误——这可能不会发生
public C(Type bar)
{
   this.foo = bar;
}
public void setFoo(Type bar)
{
   this.foo = bar;
}
int importance;

public int getImportance()
{
    return importance;
}

public void setFoo(int importance)
{
    this.importance = importance;
}
/**
 *
 * @param importance  <-- Parameter name in Javadoc matches
 *                        the parameter name in the code.
 */
public void setImportance(int importance)
{
    this.importance = importance;
}
// Code completion gives the following:
this.getImportance(importance);
class Whatever { 
  String val;
  Whatever(String va1) { this.val = val; }
  void printMe() { System.out.println(val.toString()); }
  public static void main(String[] args) {
    new Whatever("Hello").printMe();
  }
}
public class Foo {

    String value1, value2;

    public Foo setValue1(String value1) {
        this.value1 = value1;
        return this;
    }

    public Foo setValue2(String value2) {
        this.value2 = value2;
        return this;
    }
}