代码注释是架起程序设计者与程序阅读者之间的通讯桥梁,最大限度的提升团队开发合做效率。也是程序代码可维护性的重要环节之一。因此咱们不是为写注释而写注释。下面说一下Javadoc注释规范以及楼主在J2EE项目开发使用的代码注释规范,供你们参考下。html
javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类、方法、成员等注释造成一个和源代码配套的API帮助文档。java
javadoc命令是用来生成本身API文档的,使用方式:在dos中在目标文件所在目录输入javadoc +文件名.java。程序员
标签算法 |
说明数据库 |
JDK 1.1 doclet编程 |
标准浏览器 docletapp |
标签类型ide |
@author 函数 做者 |
做者标识 |
√ |
√ |
包、 类、接口 |
@version 版本号 |
版本号 |
√ |
√ |
包、 类、接口 |
@param 参数名 描述 |
方法的入参名及描述信息,如入参有特别要求,可在此注释。 |
√ |
√ |
构造函数、 方法 |
@return 描述 |
对函数返回值的注释 |
√ |
√ |
方法 |
@deprecated 过时文本 |
标识随着程序版本的提高,当前API已通过期,仅为了保证兼容性依然存在,以此告之开发者不该再用这个API。 |
√ |
√ |
包、类、接口、值域、构造函数、 方法 |
@throws 异常类名 |
构造函数或方法所会抛出的异常。 |
|
√ |
构造函数、 方法 |
@exception 异常类名 |
同@throws。 |
√ |
√ |
构造函数、 方法 |
@see 引用 |
查看相关内容,如类、方法、变量等。 |
√ |
√ |
包、类、接口、值域、构造函数、 方法 |
@since 描述文本 |
API在什么程序的什么版本后开发支持。 |
√ |
√ |
包、类、接口、值域、构造函数、 方法 |
{@link包.类#成员 标签} |
连接到某个特定的成员对应的文档中。 |
|
√ |
包、类、接口、值域、构造函数、 方法 |
{@value} |
当对常量进行注释时,若是想将其值包含在文档中,则经过该标签来引用常量的值。 |
|
√(JDK1.4) |
静态值域 |
此外还有@serial、@serialField、@serialData、{@docRoot}、{@inheritDoc}、{@literal}、 {@code} {@value arg}几个不经常使用的标签,因为不常使用,咱们展开叙述,感兴趣的读者能够查看帮助文档。
在Java中,注释一共有三类,分别是:
l 文档注释:/** ...... */ 注释若干行,并写入 javadoc 文档
/**
* .........
* .........
*/
javadoc -d 文档存放目录 -author -version 源文件名.java
这条命令编译一个名为 “源文件名.java”的 java 源文件,并将生成的文档存放在“文档存放目录”指定的目录下,生成的文档中 index.html 就是文档的首页。-author 和 -version 两个选项能够省略。
生成的文档是 HTML 格式,而这些 HTML 格式的标识符并非 javadoc 加的,而是咱们在写注释的时候写上去的。
好比,须要换行时,不是敲入一个回车符,而是写入 <br>,若是要分段,就应该在段前写入 <p>。
文档注释的正文并非直接复制到输出文件 (文档的 HTML 文件),而是读取每一行后,删掉前导的 * 号及 * 号之前的空格,再输入到文档的。如
/**
* This is first line. <br>
***** This is second line. <br>
This is third line.
*/
先举例以下
/**
* show 方法的简述.
* <p>show 方法的详细说明第一行<br>
* show 方法的详细说明第二行
* @param b true 表示显示,false 表示隐藏
* @return 没有返回值
*/
public void show(boolean b) {
frame.show(b);
}
第一部分是简述。文档中,对于属性和方法都是先有一个列表,而后才在后面一个一个的详细的说明 .
简述部分写在一段文档注释的最前面,第一个点号 (.) 以前 (包括点号)。换句话说,就是用第一个点号分隔文档注释,以前是简述,以后是第二部分和第三部分。
第二部分是详细说明部分。该部分对属性或者方法进行详细的说明,在格式上没有什么特殊的要求,能够包含若干个点号。
* show 方法的简述.
* <p>show 方法的详细说明第一行<br>
* show 方法的详细说明第二行
简述也在其中。这一点要记住了
第三部分是特殊说明部分。这部分包括版本说明、参数说明、返回值说明等。
* @param b true 表示显示,false 表示隐藏
* @return 没有返回值
javadoc 标记由“@”及其后所跟的标记类型和专用注释引用组成
javadoc 标记有以下一些:
@author 标明开发该类模块的做者
@version 标明该类模块的版本
@see 参考转向,也就是相关主题
@param 对方法中某参数的说明
@return 对方法返回值的说明
@exception 对方法可能抛出的异常进行说明
@author 做者名
@version 版本号
其中,@author 能够屡次使用,以指明多个做者,生成的文档中每一个做者之间使用逗号 (,) 隔开。@version 也可使用屡次,只有第一次有效
使用 @param、@return 和 @exception 说明方法
这三个标记都是只用于方法的。@param 描述方法的参数,@return 描述方法的返回值,@exception 描述方法可能抛出的异常。它们的句法以下:
@param 参数名 参数说明
@return 返回值说明
@exception 异常类名 说明
用法:
javadoc [options] [packagenames] [sourcefiles]
选项(options):
-public 仅显示 public 类和成员
-protected 显示 protected/public 类和成员 (缺省)
-package 显示 package/protected/public 类和成员
-private 显示全部类和成员
-d <directory> 输出文件的目标目录
-version 包含 @version 段
-author 包含 @author 段
-splitindex 将索引分为每一个字母对应一个文件
-windowtitle <text> 文档的浏览器窗口标题
javadoc 编译文档时能够给定包列表,也能够给出源程序文件列表。例如在 CLASSPATH 下有两个包若干类以下:
fancy.Editor
fancy.Test
fancy.editor.ECommand
fancy.editor.EDocument
fancy.editor.EView
能够直接编译类:
javadoc fancy\Test.java fancy\Editor.java fancy\editor\ECommand.java fancy\editor\EDocument.java fancy\editor\EView.java
也能够是给出包名做为编译参数,如:javadoc fancy fancy.editor
能够本身看看这两种方法的区别
注释文档将用来生成HTML格式的代码报告,因此注释文档必须书写在类、域、构造函数、方法、定义以前。注释文档由两部分组成——描述、块标记。
例如:
/**
* The doGet method of the servlet.
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
前两行为描述,描述完毕后,由@符号起头为块标记注视。
文件头注释以 /*开始,以*/结束,须要注明该文件建立时间,文件名,命名空间信息。
例如:
/*
* Created on 2012-12-20
* /
类、接口的注释采用 /** … */,描述部分用来书写该类的做用或者相关信息,块标记部分必须注明做者和版本。
例如:
/**Title: XXXX DRIVER 3.0
*Description: XXXX DRIVER 3.0
*Copyright: Copyright (c) 2003
*Company:XXXX有限公司
*
* @author Java Development Group
* @version 3.0
*/
例如:
/**
* A class representing a window on the screen.
* For example:
*
* Window win = new Window(parent);
* win.show();
*
*
* @author Sami Shaio
* @version %I%, %G%
* @see java.awt.BaseWindow
* @see java.awt.Button
*/
class Window extends BaseWindow {
...
}
构造函数注释采用 /** … */,描述部分注明构造函数的做用,不必定有块标记部分。
例如:
/**
* 默认构造函数
*/
又例如:
/**
* 带参数构造函数,初始化模式名,名称和数据源类型
*
* @param schema
* Ref 模式名
* @param name
* Ref 名称
* @param type
* byVal 数据源类型
*/
域注释能够出如今注释文档里面,也能够不出如今注释文档里面。用/** … */的域注释将会被认为是注释文档热出如今最终生成的HTML报告里面,而使用/* … */的注释会被忽略。
例如:
/* 因为triger和表用一个DMSource,因此要区分和表的迁移成功标记 */
boolean isTrigerSuccess = false;
又例如:
/** 因为triger和表用一个DMSource,因此要区分和表的迁移成功标记 */
boolean isTrigerSuccess = false;
再例如:
/**
* The X-coordinate of the component.
*
* @see #getLocation()
*/
int x = 1263732;
方法注释采用 /** … */,描述部分注明方法的功能,块标记部分注明方法的参数,返回值,异常等信息。例如:
/**
* 设置是否有外码约束
*
* @param conn
* Connection 与数据库的链接
*/
规则同域注释。
块标记将采用以下顺序:
…
*
* @param (classes, interfaces, methods and constructors only)
* @return (methods only)
* @exception (@throws is a synonym added in Javadoc 1.2)
* @author (classes and interfaces only, required)
* @version (classes and interfaces only, required. See footnote 1)
* @see
* @since
* @serial (or @serialField or @serialData)
* @deprecated (see How and When To Deprecate APIs)
* …
一个块标记能够根据须要重复出现屡次,屡次出现的标记按照以下顺序:
@author 按照时间前后顺序(chronological)
@param 按照参数定义顺序(declaration)
@throws 按照异常名字的字母顺序(alphabetically)
@see 按照以下顺序:
@see #field
@see #Constructor(Type, Type...)
@see #Constructor(Type id, Type id...)
@see #method(Type, Type,...)
@see #method(Type id, Type, id...)
@see Class
@see Class#field
@see Class#Constructor(Type, Type...)
@see Class#Constructor(Type id, Type id)
@see Class#method(Type, Type,...)
@see Class#method(Type id, Type id,...)
@see package.Class
@see package.Class#field
@see package.Class#Constructor(Type, Type...)
@see package.Class#Constructor(Type id, Type id)
@see package.Class#method(Type, Type,...)
@see package.Class#method(Type id, Type, id)
@see package
@param后面空格后跟着参数的变量名字(不是类型),空格后跟着对该参数的描述。
在描述中第一个名字为该变量的数据类型,表示数据类型的名次前面能够有一个冠词如:a,an,the。若是是int类型的参数则不须要注明数据类型。
例如:
…
* @param ch the char 用用来……
* @param _image the image 用来……
* @param _num 一个数字……
…
对于参数的描述若是只是一短语,最好不要首字母大写,结尾也不要句号。
对于参数的描述是一个句子,最好不要首字母大写,若是出现了句号这说明你的描述不止一句话。若是非要首字母大写的话,必须用句号来结束句子。(英文的句号)
公司内部添加ByRef和ByVal两个标记,
例如:
* @param _image the image ByRef 用来……
说明该参数是引用传递(指针),ByVal能够省略,表示是值传递。
l 返回为空(void)的构造函数或者函数,@return能够省略。
l 若是返回值就是输入参数,必须用与输入参数的@param相同的描述信息。
l 必要的时候注明特殊条件写的返回值。
l @throws之前使用的是@exception。
l @throws的内容必须在函数的throws部分定义。
类注释标记。
函数注释里面能够不出现@author。
类注释标记。
函数注释里面能够不出现@version
类注释标记。
标明该类能够运行的JDK版本
例如:
@since JDK1.2
因为某种缘由而被宣布将要被废弃的方法。
例如:
/**
* @deprecated As of JDK 1.1, replaced by
* setBounds
* @see #setBounds(int,int,int,int)
*/
语法:{@link package.class#member label}
Label为连接文字。
package.class#member将被自动转换成指向package.class的member文件的URL。
在注释描述部分可使用HTML代码。
…
表示段落
* ….
表示自动标号
/**
* Graphics is the abstract base class for all graphics contexts
* which allow an application to draw onto components realized on
* various devices or onto off-screen images.
* A Graphics object encapsulates the state information needed
* for the various rendering operations that Java supports. This
* state information includes:
*
# * 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 indicated
* {@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();
}
}
1. 文字说明代码的做用(即为何要用编写该代码,而不是如何编写);
2. 确指出该代码的编写思路和逻辑方法;
3. 人们注意到代码中的重要转折点;
4. 使代码的阅读者没必要在他们的头脑中仿真运行代码的执行方法.
简单的重复代码作写什么,这样的注释几乎不能给注释增长什么信息.若是你使用好的命名方法来建立直观明了的代码那么这些类型的注释绝对增长不了什么信息.
有的时候你可能须要违背好的编程原则,或者使用了某些不正规的方法,.遇到这种状况时,请用内部注释来讲明你在作什么和为何要这样作。
技巧性特别高的代码段,必定要加详细的注释,不要让其余开发人员花很长时间来研究一个高技巧但不易理解的程序段。
给代码加注释的方法之一是在编写一个方法前首先写上注释.若是你愿意,能够编写完整句子的注释或伪代码.一旦你用注释对代码进行了概述,就能够在注释之间编写代码.
注释必定出如今要注释的程序段前,不要在某段程序后书写对这段程序的注释,先看到注释对程序的理解会有必定帮助。
若是有可能,请在注释行与上面代码间加一空行。
注释中要分隔时,请使用一行空注释行来完成,不要使用纯色字符,以保持版面的整洁、清晰。
用星号围成的注释框,右边的星号看起来很好,但它们给注释增长了任何信息吗?实际上这会给编写或编辑注释的人增长许多工做。
注释是供人阅读的,而不是让计算机阅读的。
1) 使用完整的语句。虽然没必要将注释分红段落(最好也不要分红段落),但你应尽可能将注释写成完整的句子。
2) 避免使用缩写。缩写常使注释更难阅读, 人们经常使用不一样的方法对相同的单词进行缩写,这会形成许多混乱,若是必须对词汇缩写,必须作到统一。
3) 将整个单词大写,以突出它们的重要性。若要令人们注意注释中的一个或多个单词,请所有使用大写字母。
注释一般位于它们要说明的代码的前面。为了从视觉上突出注释与它的代码之间的关系,请将注释缩进,使之与代码处于同一个层次上。
每一个方法都应有一个注释标头。方法的注释标头可包含多个文字项,好比输入参数、返回值、原始做者、最后编辑该方法的程序员、上次修改日期、版权信息。
使用多个行尾注释时(好比用于方法顶部的多个变量说明),应使它们互相对齐。这可以使它们稍容易阅读一些。
1) 请在每一个if语句的前面加上注释。
2) 在每一个switch语句的前面加上注释。与if语句同样,switch语句用于评估对程序执行产生影响的表达式。
3) 在每一个循环的前面加上注释。每一个循环都有它的做用,许多状况下这个做用不清楚直观。
项目 |
注释哪些部分 |
实参/参数 |
参数类型 |
参数用来作什么 |
|
任何约束或前提条件 |
|
示例 |
|
字段/属性 |
字段描述 |
注释全部使用的不变量 |
|
示例 |
|
并行事件 |
|
可见性决策 |
|
类 |
类的目的 |
已知的问题 |
|
类的开发/维护历史 |
|
注释出采用的不变量 |
|
并行策略 |
|
编译单元 |
每个类/类内定义的接口,含简单的说明 |
文件名和/或标识信息 |
|
版权信息 |
|
接口 |
目的 |
它应如何被使用以及如何不被使用 |
|
局部变量 |
用处/目的 |
成员函数注释 |
成员函数作什么以及它为何作这个 |
哪些参数必须传递给一个成员函数 |
|
成员函数返回什么 |
|
已知的问题 |
|
任何由某个成员函数抛出的异常 |
|
可见性决策 |
|
成员函数是如何改变对象的 |
|
包含任何修改代码的历史 |
|
如何在适当状况下调用成员函数的例子适用的前提条件和后置条件 |
|
|
|
成员函数内部注释 |
控制结构 |
代码作了些什么以及为何这样作 |
|
局部变量 |
|
难或复杂的代码 |
|
处理顺序 |
2.4 示例
2.4.1块注释:
主要用来描述文件,类,方法,算法等。通常用在文档和方法的前面,也能够放在文档的任何地方。以‘/*’开头,‘*/’结尾。例:
……
/*
*注释
*/
……
主要用在方法内部,对代码,变量,流程等进行说明。与块注释格式类似,可是整个注释占据一行。例:
……
/*注释*/
……
2.3尾随注释:
与行注释功能类似,放在代码的同行,可是要与代码之间有足够的空间,便于分清。例:
int m=4 ;/*注释*/
若是一个程序块内有多个尾随注释,每一个注释的缩进应该保持一致。
2.4.4行尾注释:
与行注释功能类似,放在每行的最后,或者占据一行。以‘//’开头。
2.4.5文档注释:
与块注释类似,可是能够被javadoc处理,生成HTML文件。以‘/**’开头,‘*/’结尾。文档注释不能放在方法或程序块内。例:
/**
注释
*/