【问题标题】:How to write Javadoc of properties?如何编写属性的Javadoc?
【发布时间】:2011-01-17 09:46:15
【问题描述】:

在为仅包含属性和 getter 和 setter(DTO 样式)的“简单”POJO 类的属性/成员编写 javadoc 时,我经常发现自己处于两难境地......

1) 为属性编写 javadoc
或者...
2) 为 getter 编写 javadoc

如果我为该属性编写 javadoc,当我稍后通过代码完成访问 POJO 时,我的 IDE (Eclipse) 将(自然)无法显示此内容。并且没有标准的 javadoc 标签可以让我将 getter-javadoc 链接到实际的属性 javadoc。

一个例子:

public class SomeDomainClass {

  /**
   * The name of bla bla bla
   */
  private String name;

  /**
   * @return INSERT SOME SMART JAVADOC TAG LINKING TO name's javadoc
   */
  public String getName() {  
    return name;  
  }  

所以,基本上听听其他人如何让您的 Eclipse IDE 为您的 getter 显示 javadoc 属性描述会很有趣 - 而不必复制 javadoc 注释。

到目前为止,我正在考虑让我的练习只记录 getter 而不是属性。但这似乎不是最好的解决方案...

【问题讨论】:

  • 在这里进行有趣的讨论:stackoverflow.com/questions/1028967/…。接受的答案解决了您对 Eclipse / javadoc 的询问。
  • 似乎他们得出了我正在考虑的结论...仅在 getter 中编写属性 javadoc。
  • 我找到了一种方法来使用在 Eclipse 中工作的注释,甚至可以在运行时收集,这是一种选择吗?
  • 私人会员需要javadoc吗?
  • bla bla bla 的名字:最好的例子

标签: java javadoc


【解决方案1】:

Lombok 是用于此类任务的非常方便的库。

@Getter
@Setter
public class Example {
    /**
     * The account identifier (i.e. phone number, user name or email) to be identified for the account you're
     * requesting the name for
     */
    private String name;
}

这就是你所需要的! @Getter 注释为每个私有字段创建一个 getter 方法并将 javadoc 附加到它。

PS:这个库有很多很酷的功能,你可能想看看

【讨论】:

    【解决方案2】:

    我真的认为这是一个问题,官方Javadoc guide 没有透露任何信息。 C# 可以通过使用 Properties 以一种优雅的方式解决这个问题(我没有用 C# 编写代码,但我真的认为这是一个不错的功能)。

    但我有一个猜测:如果你需要解释 someString 是什么,也许它是关于你的代码的“坏小事”。这可能意味着您应该编写 SomeClass 来键入 someString,因此您将在 SomeClass 文档中解释什么是 someString,这样就不需要 getter/setter 中的 javadocs。

    【讨论】:

    • 关于代码中没有正确使用字符串,请查看 Effective Java 书籍中的“避免使用其他类型更合适的字符串”。
    【解决方案3】:

    在 Eclipse 的自动完成功能的帮助下,我两者都做。

    首先,我记录财产:

    /**
     * The {@link String} instance representing something.
     */
    private String someString;
    

    然后,我将其复制并粘贴到 getter:

    /**
     * The {@link String} instance representing something.
     */
    public String getSomeString() {
        return someString;
    }
    

    在 Eclipse 中,@return 语句具有自动完成功能 - 因此,我添加单词 Gets,将“t”小写,然后复制带有小写“t”的句子。然后我使用@return(带有 Eclipse 自动完成功能),粘贴句子,然后在 return 中将 T 大写。然后看起来像这样:

    /**
     * Gets the {@link String} instance representing something.
     * @return The {@link String} instance representing something.
     */
    public String getSomeString() {
        return someString;
    }
    

    最后,我将该文档复制到 setter:

    /**
     * Gets the {@link String} instance representing something.
     * @return The {@link String} instance representing something.
     */
    public void setSomeString(String someString) {
        this.someString = someString;
    }
    

    然后,我对其进行修改,使用 Eclipse 自动完成功能,您不仅可以获得 @param 标记,还可以获得参数名称:

    /**
     * Sets the {@link String} instance representing something.
     * @param someString The {@link String} instance representing something.
     */
    public void setSomeString(String someString) {
        this.someString = someString;
    }
    

    然后,我完成了。在我看来,从长远来看,这种模板不仅可以更容易地通过重复提醒自己属性的含义,而且还可以更容易地向 getter 和 setter 添加额外的 cmets,如果你想添加 side效果(例如不允许空属性,将字符串转为大写等)。我为此研究了制作一个 Eclipse 插件,但我找不到适合 JDT 的扩展点,所以我放弃了。

    请注意,句子可能并不总是以 T 开头 - 它只是第一个字母必须在粘贴时不大写/重新大写。

    【讨论】:

    • 复制/粘贴是邪恶的......而且很耗时。这些步骤看起来需要做很多工作,如果 javadoc 发生变化,您将有 3 个不同的地方需要更新。我认为插件也不能证明这一点......至少,然后插件必须例如将属性 javadoc 视为主属性,然后覆盖 getter(和 setter)。我想要完成的是在 1 个地方编写 javadoc,然后让 getter 和属性 javadocs 都假设相同的描述......
    • 通常,属性不会经常更改。使用 Eclipse 的自动完成功能,复制和粘贴操作在构建 Javadoc 属性后只需不到 30 秒。
    • 我不相信... 恕我直言,引入这种类型的复制/粘贴方案必然会导致不一致。我对其他厨师(或我自己)稍后编辑代码的信心太小。此外,至少如果您没有完整的前期设计,javadoc 属性通常会发生变化,至少在实验/设计阶段是这样。如果在代码新鲜的时候编写 javadoc 的质量会更好......对不起,如果我看起来像一个抱怨者;-)
    • 抱歉,但编辑 properties 必然会导致不一致 - 无论您使用哪种方式,Javadoc 都会被淘汰,除非以某种方式大力维护。即使有一种简单的方法来公开属性 javadoc,属性 javadoc 本身也很可能不会被更新。这实际上是团队的编码约定等问题,以及代码审查等问题 - 祝你好运,我就是这样做的,所以我不会忘记。
    • @Metroid - 除非以某种方式大力维护 - 好吧,它应该被大力维护如果它被视为的一部分源代码本身。并且不将 Javadoc cmets(以及它们在其他语言中的等价物)视为代码的内在部分,尽管遗憾的是它是标准做法,但它是许多罪恶的根源。最糟糕的评论是已经过时的评论。充其量,它们会减慢程序员掌握代码的速度(因为他们必须不断地重新验证并接受/拒绝过时的注释。)更糟糕的是,它们会提供容易出错、引入错误的信息。
    【解决方案4】:

    您可以在生成 Javadocs(使用 -private)时包含私有成员,然后使用 @link 链接到该字段属性。

    public class SomeDomainClass {
        /**
         * The name of bla bla bla
         */
        private String name;
    
        /**
         * {@link SomeDomainClass#name}
         */
        public String getName() {
            return name;
        }
    }
    

    或者,如果您不想为所有私有成员生成 Javadoc,您可以制定一个约定来记录所有 getter 并在 setter 上使用 @link。

    public class SomeDomainClass {
        private String name;
    
        /**
         * The name of bla bla bla
         */
        public String getName() {
            return name;
        }
    
        /**
         * {@link SomeDomainClass#getName}
         */
        public void setName(String name) {
            this.name = name;
        }
    }
    

    【讨论】:

    • 我已经尝试过@link 和@see 标签。但是......至少Eclipse 不能正确显示这个。 Eclipse 将链接显示为 ...(drumroll) .... 链接.. 必须单击该链接才能查看内容。当我实际浏览 getter 时,我希望能够激活代码完成(或通过鼠标悬停)获取属性的 javadoc...
    • @Kenny - 不要从 Eclipse 可用性的 POV 建模您的 JavaDoc 实践。从获得正确(或足够好)JavaDoc 输出的观点出发。 IDE 发生了变化,今天可能存在的缺陷可能会在明天得到解决(或者您实际上可能会完全更改 IDE。)
    • @luis @link 表示必须单击才能查看实际 javadoc 的链接。这不是 Eclipse 可用性问题,而是提供易于使用的 javadocs 的错误解决方案。
    猜你喜欢
    • 2010-10-16
    • 2011-07-05
    • 1970-01-01
    • 2011-07-20
    • 2016-06-24
    • 1970-01-01
    • 2012-06-22
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多