简单的Getter / Setter注释


124

您使用什么约定来评论获取方法和设置方法?这是我很长时间以来一直想知道的事情:

/**
 * (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();

我总是发现我几乎为1a / b和2a / b写了完全相同的东西,例如1a)设置员工的薪水,1b)员工的薪水。似乎太多余了。现在我可以看到对于更复杂的内容,您可以在(a)部分中编写更多内容,以提供具体背景信息,但是对于大多数使用方法的人来说,措辞几乎完全相同。

我只是好奇,对于简单的获取者/设置者而言,仅填写(a)部分还是(b)部分是否可以。

你怎么看?


54
顺便说一句,请永远不要将float用作任何货币(例如此处的薪水)。例如参见stackoverflow.com/questions/965831/...
Jonik

3
改用BigDecimal。
Josep

Answers:


83

我通常只为setter填充参数部分,为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();

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


你能解决错字吗?“ @setter的返回部分”
Jonik

1
salary()的注释中也有错字。这不是JavaDoc评论。
福斯塔2009年

1
我同意这是评论访问者的最佳方法。
福斯塔2009年

30
为了消除来自我们工具的过于脚的警告,在代码中添加噪音对我来说是错误的。如果它没有为程序员增加价值,那么正确的解决方案将是拒绝/修复工具的冗长性,和/或减轻我们对跳绳的关心程度,以便工具为我们带来回报。分析工具应该可以帮助我们并节省精力,而不是为我们创建更多毫无意义的任务。
Lyle

1
@Lyle可能是对的,但是我觉得程序员总是可以说出有用的东西,它比单独的方法签名更好地描述了getter / setter。是的,在某些情况下,程序员是懒惰的,只是在注释中重复方法签名,但是我认为通常来说,这是强制执行的有用行为。
Matt Vukas 2014年

174

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

/**
 * Sets the foo.
 * 
 * @param foo the foo to set
 */
public void setFoo(float foo);

如果有必要,非常有用:

/**
 * 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);

特别是,对于属性实际含义的解释在域模型中可能至关重要。每当我看到只有具有投资银行家,生物化学家或量子物理学家能理解的具有晦涩名称的特性的豆子,并且评论解释说setGobbledygook()方法“设置了gobbledygook”时,我就想勒死一个人。


2
确切地说,最糟糕的是特定于域的模型,其中只有域专家才能知道该属性的含义。
2009年

7
即使有用,您将对getFoo()做什么。您也会为getFoo()复制相同的注释吗?
Vinoth Kumar CM 2011年

3
@cmv:显然,“ param”部分不会被复制。我不确定将信息附加到两个访问器的价值是否直接证明重复信息是合理的。可能是。更好的办法是对两者都发表评论。我相信Lombok项目中可以使用此功能。
Michael Borgwardt

@VinothKumar:也许最好简单地解释getter中的属性(如“ Foo是Bar计算中使用的调整因子。”)以及更改setter中值的影响(或者是否必要)还是不初始化该值-在答案的示例中,无需初始化Foo,因为“它具有默认值,具体取决于Baz类型”。
freitass

+1代表“只有投资银行家,生物化学家或量子物理学家才能理解的晦涩名称”
杰克逊

36

如果我能帮助的话,通常没有任何帮助。吸气剂和吸气剂应该是不言自明的。

我知道这听起来像是没有答案,但是我尝试用我的时间来评论需要解释的事情。


5
遵循这些
思路的

2
@Trejkaz:并非如此,因为访问器方法允许使用只读或只写属性,并且可以使用多态性(以及包装,代理等)。
Laurent Pireyn 2011年

2
他们可能会允许这些事情,但往往有一个生成器模式可以代替制定者(较少可变)或访问者模式可以代替干将(更灵活)
Trejkaz

我当然喜欢并使用构建器模式,但是对POJO(例如在Hibernate中)的支持如此之大,以至于无论是好是坏,getter和setter仍然占据着非常重要的位置。这是关于Java,恕我直言的最糟糕的事情,并且在编写了重复的JavaDocs十多年之后,我准备接受@sleske的建议。
Michael Scheper

34

我要说的只是担心注释getter和setter,如果它们有某种副作用,或者在初始化之外需要某种先决条件(即:getting将从数据结构中删除某项,或者为了设置您需要的东西)首先放置x和y)。否则,这里的评论是多余的。

编辑:此外,如果您确实发现吸气剂/设置器涉及很多副作用,则可能需要更改吸气剂/设置器以使用不同的方法名称(即:推入并弹出堆栈)。下面的评论]


10
可以说,您应该更改具有副作用的吸气剂的名称,以使其更加清晰,因为并非所有开发人员都会阅读注释。
akf

很好-但是这要求您的API的用户知道,如果有任何副作用,它们将被记录在案
oxbow_lakes 2009年

akf,发布后我一直在想:)我想我会将其添加到我的回复中。
Gopherkhan

1
但是,如果您没有记录“愚蠢的”获取器和设置器(这也是我更喜欢的!)-如何摆脱有关缺少Javadoc的Eclipse警告?我不想像这样的警告使我的工作区混乱,但我也不想为所有其他方法禁用该警告...
Zordid 2012年

12

问自己,当注释被JavaDocs(从浏览器)查看时,您希望人们看到什么。许多人说文档是不必要的,因为它很明显。如果该字段是私有字段,则此设置将不成立(除非您显式打开私有字段的JavaDocs)。

在您的情况下:

public void setSalary(float s)
public float getSalary()

目前尚不清楚用什么工资表示。是美分,美元,英镑,人民币?

在记录设置器/获取器时,我喜欢将内容与编码分开。例:

/**
 * Returns the height.
 * @return height in meters
 */
public double getHeight()

第一行说它返回高度。返回参数记录高度以米为单位。


1
虽然我同意你的看法,但我认为必须确保函数注释不会导致错误选择,非显式函数名称。
karlipoppins

我是JavaDocs的大力支持者,也是自文档代码的大力支持者。因此,至少对于二传手,我会做类似的事情public void setSalary(float aud)(或更实际地说,是public void setSalary(BigDecimal aud))。更好的是,属性应该是type abstract class CurrencyAmount,而属性又具有java.util.Currency currencyjava.math.BigDecimal amount。与我合作的大多数开发人员对JavaDoc都非常懒惰,但是像这样强制执行A​​PI可以解决这个问题。
Michael Scheper

如果单位是米/秒等国际单位制,则无需记录,如果不是国际单位,则必须进行记录或更好地命名以包含非标准单位,例如heightFeet
AlexWien

8

为什么不只包含参考标记,以便您注释字段值以及来自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;
}

这样该文档适用于getter和setter以及字段(如果启用了私有javadocs的话)。


我同意。然后我意识到,为什么无论如何都要写所有这些样板?看到我对龙目岛计划的回答。
2014年


4

我的回答真的让我感到失望,因为基本上说全面的文档记录是浪费时间。除非您在文档中明确说明,否则API的客户端应该如何知道称为的方法setX标准JavaBean属性设置器

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

我敢肯定,我不是唯一一个不幸的人,他发现一种艰难的方法,即所谓的方法setX除了设置属性之外,还可以做更多的事情。


11
没有文档,任何调用者都将假设一个名为setX的方法设置X。因此,如果setX实际上设置了X,而没有做其他重要的事情,那么您就不需要文档。
mqp

那很棒!现在,我正在针对其编程的API的CrudTech公司是否遵循您的约定,还是遵循该线程上的其他人?Hmmmm
oxbow_lakes

5
如果该方法只是为price属性设置值,则在setPrice文档中编写“设置价格”是没有意义的,但是如果它还(例如)更新totalPrice属性并重新计算税款,则显然应记录这种行为。
若昂·马库斯

8
您似乎在要求文档说明“这可以满足您的期望”。有点像在一杯咖啡上写“小心:热”。在一个完美的世界中,永远不需要说这样的话。
凯文·潘科

1
是的-在使用过API之类的方法具有诸如setX预期之外的副作用的情况下,我确实可以自信地说这不是一个完美的世界。
oxbow_lakes

4

如果在getter / setter中没有特殊的操作,我通常会这样写:

使用Javadoc(带有私有选项):

/** Set {@see #salary}. @param {@link #salary}. */
public void setSalary(float salary);

和/或

/** 
 * Get {@see #salary}.
 * @return {@link #salary}.
 */
public float salary();

使用Doxygen(带有私人提取选项):

/** @param[in] #salary. */
public void setSalary(float salary);

/** @return #salary. */
public float salary();

2
这种方法的问题在于,默认情况下Javadoc不会生成私有文档!在这种情况下,参考标记{@see #salary}在生成的文档中无效。
JarekPrzygódzki'12

1

评论访问者是不必要的,尤其是如果访问者不在任何地方进行任何操作时,也很浪费指尖。

如果阅读您的代码的某人不理解person.getFirstName()返回一个人的名字,则应尽一切可能将他开除。如果它做了一些数据库魔术,扔了一些骰子,打电话给名字秘书来获得名字,那么可以肯定地认为这是一项不平凡的操作,并且可以很好地记录下来。

另一方面,如果您person.getFirstName()没有返回某人的名字...那么,让我们不要去那里,对吧?


6
如果getFirstName()返回null怎么办?在哪里记录?
Steve Kuo

怎么样security.getFinalMaturity()?并非所有属性名称都具有立即可理解的含义。您是否会因为不知道那意味着什么而被炒鱿鱼?
Michael Borgwardt 2009年

如果该方法是通过旋转实现的呢?除非得到明确记录,否则您应该如何知道?除非医生说是这样,否则您应该如何知道它是标准设置器?
oxbow_lakes,2009年

2
我认为get / set应该保留给getter和setter。数据库查找应命名为“ lookupPerson”左右。
托尔比约恩Ravn的安德森

1

如果字段名称足以说明内容,则不要放置任何内容。

通常,让代码自立,并尽可能避免注释。这可能需要重构。

编辑:上面仅指吸气剂和二传手。我相信任何不重要的事情都应该正确地javadoc'ed。


1
评论和记录之间是有区别的。
Tom Hawtin-大头钉

1
非常真实 因此,正是因为如此,我才不评论getter和setter。它们应该是自解释的,并添加注释表明代码不是自解释的。
托尔比约恩Ravn的安德森

0

可以填写(b)部分,尤其是如果您在字段声明中添加注释以指示该字段的全部内容。


不好-人们没有阅读现场评论。默认情况下,Javadoc甚至不会生成私有文档,并且在对方法调用使用快速帮助时,IDE不会向您显示字段文档。
Trejkaz 2010年

除非有必要,否则人们不会阅读字段注释。一旦有需要,越多的信息越好。
akf 2010年

0

如果javadoc没有添加任何内容,则删除javadoc并使用自动生成的注释。


0

我总是都填写。花费在打字上的额外时间可以忽略不计,总的来说,信息多于少。


如果您说“这是财产设定者”,他们只是不言自明。否则,API的客户端将不知道方法内部实际发生了什么
oxbow_lakes 2009年

1
谁对自我解释说什么?
Paul Sonier 2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.