重载方法的Javadoc重用


81

我正在开发一个API,其中包含许多相同名称的方法,只是签名不同而已,这在我看来是很普遍的。它们都做相同的事情,不同之处在于,如果用户不想指定默认值,则会默认初始化各种值。作为一个容易理解的例子,考虑

public interface Forest
{
  public Tree addTree();

  public Tree addTree(int amountOfLeaves);

  public Tree addTree(int amountOfLeaves, Fruit fruitType);

  public Tree addTree(int amountOfLeaves, int height);

  public Tree addTree(int amountOfLeaves, Fruit fruitType, int height);
}

所有这些方法执行的基本动作是相同的;森林里种了一棵树。我的API用户需要了解许多重要事项,以了解如何为所有这些方法添加树。

理想情况下,我想编写一个Javadoc块,供所有方法使用:

  /**
   * Plants a new tree in the forest. Please note that it may take
   * up to 30 years for the tree to be fully grown.
   *
   * @param amountOfLeaves desired amount of leaves. Actual amount of
   * leaves at maturity may differ by up to 10%.
   * @param fruitType the desired type of fruit to be grown. No warranties
   * are given with respect to flavour.
   * @param height desired hight in centimeters. Actual hight may differ by
   * up to 15%.
   */

在我的想象中,工具可以神奇地选择将@params应用于每个方法,从而一次为所有方法生成良好的文档。

使用Javadoc,如果我理解正确的话,我所能做的基本上是将同一javadoc块复制并粘贴五次,每种方法的参数列表仅稍有不同。这对我来说听起来很麻烦,而且也很难维护。

有什么办法解决吗?对javadoc的某种扩展具有这种支持?还是有一个很好的理由为什么我错过了不支持此功能?


1
伟大的问题和优秀的描述,谢谢。
2014年

Answers:


75

我不知道有什么支持,但是,我会使用最多参数的javadoc方法,然后像这样在其他javadoc中引用它。我认为这已经足够清楚了,并且避免了冗余。

/**
 * {@code fruitType} defaults to {@link FruitType#Banana}.
 *
 * @see Forest#addTree(int, Fruit, int)
 */

奇怪,当我从另一个文件而不是从同一个文件(在Mac上的Eclipse 4.7)中引用该方法时,此方法有效-当您尝试弃用一个重载并将调用者指向未弃用的方法时,这很痛苦超载。
Sridhar Sarnobat

2
@ Sridhar-Sarnobat:在同一文件中,它应该是@see #addTree(int, Fruit, int)(没有Forest
Mooing Duck

Eclipse不允许我单击该方法以将我带到所引用的方法:(
Sridhar Sarnobat

14

我只记录您的“最完整”方法(在这种情况下为addTree(int,Fruit,int)),然后在JavaDoc中为其他方法引用该方法,并说明如何/哪些默认值用于未提供的参数。

/**
 * Works just like {@link ThisClass#myPow(double,double)} except the exponent is always 
 * presumed to be 2. 
 *
 * @see ThisClass#myPow(double,double)
 */
 static double myPow( double base );


0

如果可以的话,将文档放在界面上。然后,实现该接口的类将继承javadoc。

interface X(){
 /** does fooish things */
 void foo();
}

class Ax implements X{ //automatically inherits the Javadoc of "X"
 @Override 
 public void foo(){/*...*/} 
}

如果您想继承文档并向其中添加自己的内容,可以使用{@inheritDoc}:

class Bx implements X{
 /**
  * {@inheritDoc}
  * May fail with a RuntimeException, if the machine is too foo to be true.
  */
 @Override 
 public void foo(){/*...*/}
}

另请参阅:http : //docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javadoc.html#inheritingcomments

现在,据我所知,这并不是您想要的(您想要避免同一类/接口中的方法之间的重复)。为此,您可以使用@see或@link,如其他人所述,或者您可以考虑自己的设计。也许您希望避免重载该方法,而将单个方法与参数对象一起使用,如下所示:

public Tree addTree(TreeParams p);

要这样使用:

forest.addTree(new TreeParams().with(Fruits.APPLE).withLeaves(1500).withHeight(5));

您可能想在这里查看此复制突变器模式:

https://brixomatic.wordpress.com/2010/03/10/dealing-with-immutability-and-long-constructors-in-a-fluent-way/

根据参数组合的数量,这可能是一种更简便,更简洁的方法,因为Params-Class可以捕获默认值,并且每个参数都有一个Javadoc。

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.