java:⽆效的标记:-enconding_Java程序员,你真的会写
Java⽂档注释(J。。。
点击上⽅☝Java编程技术乐园,轻松关注!及时获取有趣有料的技术⽂章
本⽂翻译⾃How to Write Doc Comments for the Javadoc Tool,但是精简了⼀些私以为不重要的东西
本⽂不讨论如何使⽤javadoc⼯具⾃动⽣成⽂档的⽅法,⽽是主要探讨应该如何去写⽂档注释
⽂档注释概览
“⽂档注释”(Java Doc Comments)是专门为了⽤javadoc⼯具⾃动⽣成⽂档⽽写的注释,它是⼀种带有特殊功能的注释。
⽂档注释与⼀般注释的最⼤区别在于起始符号是/**⽽不是/*或//。
⽐如:
/*** 这是⽂档注释*//** 这是⼀般注释*/// 这是⼀般注释
在⼀些IDE(⽐如Eclipse)中,⽂档注释会以不同于普通注释的颜⾊⾼亮显⽰。
此外,⽂档注释只负责描述类(class)、接⼝(interface)、⽅法(method)、构造器(constructor)、成员字段(field)。相应地,⽂档注释必
须写在类、接⼝、⽅法、构造器、成员字段前⾯,⽽写在其他位置,⽐如函数内部,是⽆效的⽂档注释。
⽂档注释采⽤HTML语法规则书写,⽀持HTML标记(tag),同时也有⼀些额外的辅助标记。需要注意的是,这些标记不是给⼈看的(通常他
们的可读性也不好),他们的作⽤是为了javadoc⼯具更好地⽣成最终⽂档。所以,虽然有些标记写起来⿇烦且看着不直观,还是要⽼⽼实实按规矩写滴。
⽂档注释的基本内容
⼀个⽂档注释由两部分组成:
/*** 描述部分(description) ** 标记部分(block tags)*/
描述部分⾃然不⽤多说,所谓的标记符号指的是@param, @return, @see之类的,相信只要看过开源java代码的话应该都见过。
下⾯是⼀个描述⼀个⽅法的⽂档注释的例⼦
/** * Returns an Image object that can then be painted on the screen. * The url argument must specify an absolute {@link URL}. The name * argument is ajava怎么编写
* This method always returns immediately, whether or not the * image exists. When this applet attempts to draw the image on * the screen,
the data will be loaded. The graphics primitives * that draw the image will incrementally paint on the screen. * * @param url an absolute
URL giving the base location of the image * @param name the location of the image, relative to the url argument * @return the image at the specified URL * @see Image */public Image getImage(URL url, String name) { try { return getImage(new URL(url, name)); } catch (MalformedURLException e) { return null; }}
需要注意的⼏点:
1. 第⼀⾏以特殊的⽂档定界符 /** 开头
3. 在描述段落和标记段落之间空⼀⾏,描述段落和标记段落必须分开,不能揉在⼀起,描述段落必须在标记段落之前
4. 每⼀⾏注释都应该跟后⾯描述的类、⽅法等保持同样距离的缩进,⽐如这样就是错误的
class Image {/*** 没有跟下⾯的⽅法保持同样的缩进*/ public Image getImage(URL url, String name) { ... }}
5. 从javadoc 1.4之后,除第⼀⾏和最后⼀⾏外,可以省略其他⾏的前导星号(*),但是⼀般不这么做
描述部分(Description)
描述部分的第⼀⾏应该是⼀句对类、接⼝、⽅法等的简单描述,这句话最后会被javadoc⼯具提取并放在索引⽬录中。
怎么界定第⼀句话到哪结束了呢?答案是跟在第⼀个句号(英⽂标点)之后的tab、空⾏或⾏终结符规定了第⼀句的结尾。
例如下⾯这句注释,第⼀句的结尾是Prof.:
/*** This is a simulation of Prof. Knuth's MIX computer.*/
除了普通的⽂本之外,描述部分可以使⽤:
xxx
1. HTML语法标签,例如 xxx
2. javadoc规定的特殊标签,例如 {@link xxx} 。标签的语法规则是:{@标签名 标签内容}
需要注意的地⽅:
1. 标签在有javadoc⼯具⽣成⽂档时会转化成特殊的内容,⽐如 {@link URL} 标签会被转化成指向URL类的超链接
2. 如果注释包含多段内容,段与段之间需要⽤
分隔,空⾏是没⽤的
3. 最后结尾⾏ */ 和起始⾏不同,这⾥只有⼀个星号
4. 为了避免⼀⾏过长影响阅读效果,务必将每⾏的长度限制在80个字符以内
5. 善⽤javadoc⼯具的复制机制避免不必要的注释:
如果⼀个⽅法覆盖了⽗类的⽅法或实现了接⼝种的⽅法,那么javadoc⼯具会在该注释⾥添加指向原始⽅法的链接,此外如果新⽅法没有注释,那么javadoc会把原始⽅注释风格:
1. 使⽤ 关键字 来强调关键字,建议强调的内容有:java关键字、包名、类名、⽅法名、接⼝名、字段名、参数名等
2. 控制 {@link xxx} 的数量,太多的链接会使⽂档的可读性很差,因为读者总是跳来跳去。不要出现相同的链接,同样的链接只保留第⼀
个;不要为java⾃带的内容或是常识性的内容提供链接
3. 描述⼀个⽅法时,应当只保留⽅法名字,不要附带⽅法的参数。⽐如有个⽅法是add(Object obj),那么⽤add指代该⽅法即可,⽽不是
add(Object obj)
4. 英⽂注释可以是短语也可以是句⼦。如果是句⼦,⾸字母要⼤写,如果是短语,⾸字母⼩写。
5. 英⽂注释使⽤第三⼈称,⽽不是第⼆⼈称。⽐如:
/*** Gets the label(建议) *//*** Get the label(不建议)*/
6. ⽅法的注释应该以动词或动词词组开头,因为⽅法是⼀个动作。⽐如:
/
*** Gets the label of this button(建议)*//*** This method gets the label(不建议)*/
7. 当描述类、接⼝、⽅法这类的概念时,可以不⽤指名"类"、"接⼝"、"⽅法"这些词语,⽐如:
/*** A button label (建议)*//*** This field is a button label (不建议)*/
8. 英⽂使⽤this⽽不是the指代当前类,⽐如:
/*** Gets the toolkit for this component (建议)*//*** Gets the toolkit for the component (不建议)*/
9. API名应该是能够简单⾃我说明的,如果⽂档注释只是简单重复API的名称还不如没有⽂档,所以⽂档注释应该⾄少提供⼀些额外信息,
否则⼲脆不要注释
10. 英⽂注释避免拉丁风格的缩写。⽐如使⽤"also knwon as"⽽不是"aka", 使⽤"that is"或"to be specific"⽽不是"i.e.",使⽤"for
example"⽽不是"e.g.",使⽤"in other words"或"namely"⽽不是"viz."
标记部分(Tag)
标记部分跟在描述部分之后,且前⾯必须有⼀个空⾏间隔
常见标记:
1. @author 作者,没有特殊格式要求,名字或组织名称都可以
2. @version 软件版本号(注意不是java版本号),没有特殊格式要求
3. @param ⽅法参数,格式为: @param 参数名称 参数描述
可以在参数描述中说明参数的类型
可以在参数名称和参数描述之间添加额外的空格来对齐
破折号或其他标点符号不能出现在参数描述之外的地⽅
4. @return ⽅法返回值,格式为: @return 返回值描述 ,如果⽅法没有返回值就不要写@return
5. @deprecated 应该告诉⽤户这个API被哪个新⽅法替代了,随后⽤ @see 标记或 {@link} 标记指向新API,⽐如:
/*** @deprecated As of JDK 1.1, replaced by* {@link #setBounds(int,int,int,int)}*/
6. @throws (或 @exception )包含⽅法显式抛出的检查异常(Checked Exception),⾄于⾮显⽰抛出的其他异常(Unchecked
Exception),除⾮特别有必要,否则就别写了。⼀个原则就是,只记录可控的问题,对于不可控的或不可预测的问题,不要往上⾯写。
检查异常:在try语法块中触发,在catch块中捕获的异常,这些异常会由编译器在编译阶段检查并强制程序员处理⾮检查异常:包括运⾏时异常(RuntimeException)和错
7. ⾃定义标记
注释风格:
1. 按照如下顺序提供标记
@author(只出现在类和接⼝的⽂档中)@version(只出现在类和接⼝的⽂档中)@param(只出现在⽅法或构造器的⽂档中)@return(只出现在⽅法中)@exception(从java1此外,如果有多个相同标记,也要注意顺序:
多个@author标记,应该按照时间顺序排列,即原作者应该排在第⼀个位置多个@param标记,应该按照参数定义的顺序排列多个@exception(或是@thrown)应该按照
2. 必须包含的标记
如果⽅法有参数,@param标记必须包含,⽽且每个对应⼀个参数如果⽅法有返回值,@return标记必须包含
其他注释
1. 包级别的⽂档注释
从java1.2起允许包级别的⽂档注释,⽤以描述包信息。每个包都可以有⾃⼰的包⽂档注释,这些注释被写在叫package.html的单独⽂件中,并且放⾄于与源码(*.java)相同的路径下,注意,⼀定不能单独放置在其他路径。
javadoc⼯具按照以下流程处理package.html:
把主要内容复制到最终⽣成的package-summary.html⽂件中处理@see, @since, 或{@link}标记把第⼀句话复制到javadoc的索引中
在包注释主要介绍⼀下这个包⼤致是做什么⽤的、背景信息、在使⽤⽅⾯需要注意的地⽅等等信息
2. 匿名、内部类的⽂档注释
javadoc不会提取内部类的⽂档注释,所以如果想要在最终⽣成的⽂档中包含内部类的信息,⽅法就是——写在外部类的⽂档注释⾥。。
⼀个复杂的⽂档注释例⼦
/** * Graphics is the abstract base class for all graphics contexts * which allow an application to draw onto components realized on * various devices or onto
* The Component to draw on * A translation origin for rendering and clipping coordinates * The current clip * The current color * The current font * The current logical pixel operation function (XOR or Paint) * The current XOR alternation color * (see setXORMode) * *
* Coordinates are infinitely thin and lie between the pixels of the * output device. * Operations which draw the outline of a figure operate by traversing * along the infinitely thin path with a pixel-sized pen that hangs * down and to the right of the anchor point on the path. * Operations which fill a figure operate by filling the interior * of the infinitely thin path. * Operations which render horizontal text render the ascending * portion of the characters entirely above the baseline coordinate. *
* Some important points to consider are that drawing a figure that * covers a given rectangle will occupy one extra row of pixels on * the
right and bottom edges compared to filling a figure that is * bounded by that same rectangle. * Also, drawing a horizontal line along the same y coordinate as * the baseline of a line of text will draw the line entirely below * the text except for any descenders. * Both of these properties are due to the pen hanging down and to * the right from the path that it traverses. *
* All coordinates which appear as arguments to the methods of this * Graphics object are considered relative to the translation origin * of
this Graphics object prior to the invocation of the method. * All rendering operations modify only pixels which lie within the * area bounded
by both the current clip of the graphics context * and the extents of the Component used to create the Graphics object. * * @author Sami Shaio * @author Arthur van Hoff * @version %I%, %G% * @since 1.0 */public abstract class Graphics { /** * Draws as much of the specified image as is currently available * with its northwest corner at the specified coordinate (x, y). * This method will return immediately in all cases, even if the * entire image has not yet been scaled, dithered and converted * for the current output device. *
* If the current output representation is not yet complete then * the method will return false and the in
dicated * {@link ImageObserver} object will be notified as the * conversion process progresses. * * @param img the image to be drawn * @param x the x-coordinate of the northwest corner * of the destination rectangle in pixels * @param y the y-coordinate of the northwest corner * of the destination rectangle in pixels * @param observer the image observer to be notified as more * of the image is converted. May be * null * @return true if the image is completely * loaded and was painted successfully; * false otherwise. * @see Image * @see ImageObserver * @since 1.0 */ public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer); /** * Dispose of the system resources used by this graphics context. * The Graphics context cannot be used after being disposed of. * While the finalization process of the garbage collector will * also dispose of the same system resources, due to the number * of Graphics objects that can be created in short time frames * it is preferable to manually free the associated resources * using this method rather than to rely on a finalization * process which may not happen for a long period of time. *
* Graphics objects which are provided as arguments to the paint * and update methods of Components are automatically disposed * by the system when those methods return. Programmers should, * for efficiency, call the dispose method when finished using * a Graphics object only if it was created directly from a * Component or another Graphics object. * * @see #create(int, int, int, int) *
@see #finalize() * @see Component#getGraphics() * @see Component#paint(Graphics) * @see Component#update(Graphics) * @since 1.0 */ public abstract void dispose(); /** * Disposes of this graphics context once it is no longer * referenced. * * @see #dispose() * @since 1.0 */ public void finalize() { dispose(); }}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论