简单的Getter/Setter评论

Tha*_*Don 119 java getter setter comments javadoc

您使用什么约定来评论getter和setter?这是我一直想知道的事情,例如:

/**
 * (1a) what do you put here?
 * @param salary (1b) what do you put here?
 */
public void setSalary(float salary);

/*
 * (2a) what do you put here?
 * @return (2b)
 */
public float getSalary();
Run Code Online (Sandbox Code Playgroud)

我总是发现我为1a/b和2a/b编写完全相同的东西,例如1a)设置雇员的工资,1b)雇员的工资.这似乎是多余的.现在我可以看到更复杂的东西,你可以在(a)部分写更多内容,给出上下文,但对于大多数的getter/setter,那里的措辞几乎完全相同.

我只是好奇,如果对于简单的getter/setter,只需填写(a)部分或(b)部分即可.

你怎么看?

Mic*_*rdt 172

绝对毫无意义 - 如果没有这种垃圾使你的代码混乱,你会变得更好:

/**
 * Sets the foo.
 * 
 * @param foo the foo to set
 */
public void setFoo(float foo);
Run Code Online (Sandbox Code Playgroud)

非常有用,如果有必要:

/**
 * Foo is the adjustment factor used in the Bar-calculation. It has a default
 * value depending on the Baz type, but can be adjusted on a per-case base.
 * 
 * @param foo must be greater than 0 and not greater than MAX_FOO.
 */
public void setFoo(float foo);
Run Code Online (Sandbox Code Playgroud)

特别是对属性实际意味着什么的解释在领域模型中是至关重要的.每当我看到一个充满了晦涩名称的财产的豆子,只有投资银行家,生物化学家或量子物理学家才能理解,并且评论解释说setGobbledygook()方法"设置了狼吞虎咽".我想扼杀某人.

  • 迈克尔,当你扼杀他们时,我会把他们抱下来! (50认同)
  • 即使它有用,你会为getFoo()做什么.你会为getFoo()复制相同的评论吗? (7认同)
  • @cmv:显然,"param"部分不会被复制.我不确定将两个访问者附加信息的价值直接证明是否有理由重复信息.可能是.更好的方法是将两条评论附加到两者上; 我相信这可以在Lombok项目中找到. (3认同)
  • 我的观点是,最糟糕的是领域特定模型,其中只有领域专家知道该属性的含义。 (2认同)
  • +1“只有投资银行家、生物化学家或量子物理学家才能理解的晦涩名字” (2认同)

sle*_*ske 80

我通常只为setter填充param部分,为getter填充@return部分:

/**
 * 
 * @param salary salary to set (in cents)
 */
public void setSalary(float salary);

/**
 * @return current salary (in cents, may be imaginary for weird employees)
 */
public float getSalary();
Run Code Online (Sandbox Code Playgroud)

这样,javadoc检查工具(例如Eclipse的警告)将会变得干净,并且没有重复.

  • 为了从我们的工具中消除过于迂腐的警告,为代码添加噪音对我来说是错误的.如果它没有为程序员增加价值,那么正确的解决方案就是调低/修复工具的冗长程度和/或减轻我们对跳过篮球的关注程度,以便工具奖励我们.分析工具应该可以帮助我们并节省工作量,而不是为我们创造更多无意义的任务. (28认同)
  • @Lyle 这可能是真的,但我觉得程序员几乎总能说出一些有用的东西来描述 getter/setter,而不仅仅是方法签名。是的,有些情况下程序员很懒惰,只是在注释中重复方法签名,但我认为一般来说,强制是一种有益的行为。 (2认同)

Eri*_*lin 36

一般没什么,如果我可以帮助它.吸气剂和二传手应该是不言自明的.

我知道这听起来像是一个非答案,但我试着用我的时间来评论需要解释的事情.

  • 沿着这些方向的另一个有效答案可能是"使用getter和setter的设计无法正确理解封装的概念":) (5认同)
  • @Trejkaz:不正确,因为访问器方法允许只读或只写属性,以及多态(以及包装,代理等). (2认同)
  • 它们可能允许这些东西,但通常构建器模式可以替换setter(不太可变)或访问者模式可以替换getter(更灵活.) (2认同)

Gop*_*han 34

我只是说如果他们有某种副作用,或者在初始化之外需要某种先决条件(例如:获取将从数据结构中删除项目,或者为了设置你需要的东西),只会担心评论getter和setter首先让x和y到位).否则这里的评论非常多余.

编辑:此外,如果你确实发现你的getter/setter中涉及很多副作用,你可能想要更改getter/setter以使用不同的方法名称(即:push和pop for a stack)[感谢以下评论]

  • 可以说,您应该更改具有副作用的getter的名称,以便更清楚,因为并非所有开发人员都会阅读评论. (10认同)

Ste*_*Kuo 12

问问自己,当评论被视为JavaDocs时,您希望人们看到什么(来自浏览器).许多人说文档没有必要,因为它很明显.如果字段是私有的,则不会成立(除非您为私有字段明确打开JavaDocs).

在你的情况下:

public void setSalary(float s)
public float getSalary()
Run Code Online (Sandbox Code Playgroud)

目前尚不清楚薪水表示的是什么.它是美分,美元,英镑,人民币?

在记录setter/getter时,我喜欢将其与编码分开.例:

/**
 * Returns the height.
 * @return height in meters
 */
public double getHeight()
Run Code Online (Sandbox Code Playgroud)

第一行表示它返回高度.返回参数记录高度以米为单位.


小智 9

为什么它们只是包含一个引用标记,以便您对getter和setter的字段值和引用进行注释.

/**
* The adjustment factor for the bar calculation.
* @HasGetter
* @HasSetter
*/
private String foo;

public String getFoo() {
  return foo;
}

public void setFoo() {
  this foo = foo;
}
Run Code Online (Sandbox Code Playgroud)

这样文档就适用于getter和setter以及字段(如果启用私有javadocs).


Mic*_*per 6

使用Project Lombok可以避免这种样板.只记录字段变量,即使它是private,并让Lombok注释生成正确记录的getter和setter.

对我来说,这个好处是值得的成本.


oxb*_*kes 5

我对基本上说全面记录是浪费时间的答案感到非常失望。除非您在文档中明确说明,否则您的 API 的客户如何知道被调用的方法setX标准的 JavaBean 属性设置器

如果没有文档,调用者将不知道该方法是否有任何副作用,除了对所遵循的明显约定交叉手指。

我敢肯定,我不是这里唯一不幸地发现被调用的方法setX所做的不仅仅是设置属性的困难方式。

  • 如果没有文档,任何调用者都会假设一个名为 setX 的方法设置了 X。因此,如果 setX 实际上设置了 X,而没有做任何其他重要的事情,那么您就不需要文档。 (11认同)
  • 您似乎要求文档说明“这符合您的期望”。这有点像在一杯咖啡上写上“注意:热”。在一个完美的世界里,根本没有必要说这种话。 (8认同)
  • 如果该方法只是设置 price 属性的值,则在 setPrice 文档中编写“设置价格”是没有意义的,但是如果它还更新了 totalPrice 属性并重新计算税收,则显然应该记录这种行为。 (5认同)