2023年6月25日发(作者:)
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 a* 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 absoluteURL giving the base location of the image * @param name the location of the image, relative to the url argument * @return the image at thespecified 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.*/除了普通的⽂本之外,描述部分可以使⽤:1. HTML语法标签,例如 xxxxxx2. 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.",使⽤"forexample"⽽不是"e.g.",使⽤"in other words"或"namely"⽽不是"viz."标记部分(Tag)标记部分跟在描述部分之后,且前⾯必须有⼀个空⾏间隔常见标记:1. @author 作者,没有特殊格式要求,名字或组织名称都可以2. @version 软件版本号(注意不是java版本号),没有特殊格式要求3. @param ⽅法参数,格式为: @param 参数名称 参数描述可以在参数描述中说明参数的类型可以在参数名称和参数描述之间添加额外的空格来对齐破折号或其他标点符号不能出现在参数描述之外的地⽅4. @return ⽅法返回值,格式为: @return 返回值描述 ,如果⽅法没有返回值就不要写@return5. @deprecated 应该告诉⽤户这个API被哪个新⽅法替代了,随后⽤ @see 标记或 {@link} 标记指向新API,⽐如:/*** @deprecated As of JDK 1.1, replaced by* {@link #setBounds(int,int,int,int)}*/6. @throws (或 @exception )包含⽅法显式抛出的检查异常(Checked Exception),⾄于⾮显⽰抛出的其他异常(UncheckedException),除⾮特别有必要,否则就别写了。⼀个原则就是,只记录可控的问题,对于不可控的或不可预测的问题,不要往上⾯写。检查异常:在try语法块中触发,在catch块中捕获的异常,这些异常会由编译器在编译阶段检查并强制程序员处理⾮检查异常:包括运⾏时异常(RuntimeException)和错7. ⾃定义标记注释风格:1. 按照如下顺序提供标记@author(只出现在类和接⼝的⽂档中)@version(只出现在类和接⼝的⽂档中)@param(只出现在⽅法或构造器的⽂档中)@return(只出现在⽅法中)@exception(从java1此外,如果有多个相同标记,也要注意顺序:多个@author标记,应该按照时间顺序排列,即原作者应该排在第⼀个位置多个@param标记,应该按照参数定义的顺序排列多个@exception(或是@thrown)应该按照2. 必须包含的标记如果⽅法有参数,@param标记必须包含,⽽且每个对应⼀个参数如果⽅法有返回值,@return标记必须包含其他注释1. 包级别的⽂档注释从java1.2起允许包级别的⽂档注释,⽤以描述包信息。每个包都可以有⾃⼰的包⽂档注释,这些注释被写在叫的单独⽂件中,并且放⾄于与源码(*.java)相同的路径下,注意,⼀定不能单独放置在其他路径。javadoc⼯具按照以下流程处理:把主要内容复制到最终⽣成的⽂件中处理@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 currentfont * 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 bytraversing * 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 theascending * 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 * theright and bottom edges compared to filling a figure that is * bounded by that same rectangle. * Also, drawing a horizontal line along thesame y coordinate as * the baseline of a line of text will draw the line entirely below * the text except for any descenders. * Both of theseproperties 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 * ofthis Graphics object prior to the invocation of the method. * All rendering operations modify only pixels which lie within the * area boundedby both the current clip of the graphics context * and the extents of the Component used to create the Graphics object. * * @author SamiShaio * @author Arthur van Hoff * @version %I%, %G% * @since 1.0 */public abstract class Graphics { /** * Draws as much of the specifiedimage as is currently available * with its northwest corner at the specified coordinate (x, y). * This method will return immediately in allcases, 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} objectwill be notified as the * conversion process progresses. * * @param img the image to be drawn * @param x the x-coordinate of thenorthwest corner * of the destination rectangle in pixels * @param y the y-coordinate of the northwest corner * of the destination rectangle inpixels * @param observer the image observer to be notified as more * of the image is converted. May be * null * @return true if the image iscompletely * loaded and was painted successfully; * false otherwise. * @see Image * @see ImageObserver * @since 1.0 */ public abstractboolean 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 ofthe same system resources, due to the number * of Graphics objects that can be created in short time frames * it is preferable to manuallyfree the associated resources * using this method rather than to rely on a finalization * process which may not happen for a long period oftime. ** Graphics objects which are provided as arguments to the paint * and update methods of Components are automatically disposed * by thesystem when those methods return. Programmers should, * for efficiency, call the dispose method when finished using * a Graphics objectonly if it was created directly from a * Component or another Graphics object. * * @see #create(int, int, int, int) * @see #finalize() * @seeComponent#getGraphics() * @see Component#paint(Graphics) * @see Component#update(Graphics) * @since 1.0 */ public abstract voiddispose(); /** * Disposes of this graphics context once it is no longer * referenced. * * @see #dispose() * @since 1.0 */ public void finalize() {dispose(); }}
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687678826a30882.html
评论列表(0条)