《JAVA代码规范》(四)通用代码格式 - 注释(2.7)

2019-03-28 17:39|来源: 苦力工

2.7      注释

Java程序有两类注释:实现注释(implementation comments)和文档注释(document comments)。实现注释是那些在C++中见过的,使用/*...*///界定的注释。文档注释(被称为"doc comments")Java独有的,并由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文件。

注意:频繁的注释有时反映出代码的低质量。当你觉得被迫要加注释的时候,考虑一下重写代码使其更清晰。

2.7.1        注释约定

?         注释应该增加代码的清晰度。代码注释的目的是要使代码更易于被同时参与程序设计的开发人员以及其他后继开发人员理解。

?         避免使用装饰性内容,也就是说,不要使用象广告横幅那样的注释语句。典型的是用星号将他们的内部注释圈起来。这只是在大量浪费时间,并不能给最终的产品增加丝毫价值。

?         保持注释的简洁。最好的注释应该是简单明了的注释。注释不必洋洋洒洒,只需提供足够的信息,使别人能够理解你的代码。

?         先写注释,后写代码。写代码注释的最好方法是在写代码之前就写注释。这使你在写代码之前可以想想代码的功能和运行。而且这样确保不会遗漏注释。另一种方法是边写代码边写注释。因为注释可以使代码更易理解,所以在程序开发的过程中,也可以利用这一点。如果打算花些时间写注释,那么至少你应从这个过程中获得些什么

?         注释信息不仅要包括代码的功能,还应给出原因。例如,下面例子中的代码显示金额在$1,000 以上(包括 $1,000)的定单可给予 5% 的折扣。为什么要这样做呢?难道有一个商业法则规定大额定单可以得到折扣吗?这种给大额定单的特殊是有时限的呢,还是一直都这样?最初的程序设计者是否只是由于慷慨大度才这样做呢?除非它们在某个地方(或者是在源代码本身,或者是在一个外部文档里)被注释出来,否则你不可能知道这些。

例:

if (grandTotal >= 1000.00) {

grandTotal = grandTotal * 0.95;

}

2.7.2        实现注释的格式

程序可以有4种实现注释的风格:块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)

?        块注释

    块注释通常用于提供对文件,方法,数据结构和算法的描述。块注释被置于每个文件的开始处以及每个方法之前。它们也可以被用于其他地方,比如方法内部。在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。块注释之首应该有一个空行,用于把块注释和代码分割开来,比如:

/*
 * Here is a block comment.
 */

块注释可以以/*-开头,这样indent(1)就可以将之识别为一个代码块的开始,而不会重排它。

/*
 * Here is a block comment with some very special
 * formatting that I want indent(1) to ignore.
 *
 *    one
 *        two
 *            three
 */

?        单行注释

短注释可以显示在一行内,并与其后的代码具有一样的缩进层级。如果一个注释不能在一行内写完,就该采用块注释(参见"块注释")。单行注释之前应该有一个空行。以下是一个Java代码中单行注释的例子:

if (condition) {
    /* Handle the condition. */
    ...
  }

?        尾端注释

极短的注释可以与它们所要描述的代码位于同一行,但是应该有足够的空白来分开代码和注释。若有多个短注释出现于大段代码中,它们应该具有相同的缩进。以下是一个Java代码中尾端注释的例子:

if (a == 2) {
     return TRUE;              /* special case */
 } else {
     return isPrime(a);        /* works only for odd a */
 }

?        行末注释

注释界定符"//",可以注释掉整行或者一行中的一部分。它一般不用于连续多行的注释文本;然而,它可以用来注释掉连续多行的代码段。以下是所有三种风格的例子:

if (foo > 1) {
 
     // Do a double-flip.
     ...
 }
 else {
     return false;          // Explain why here.
 }
 
 //if (bar > 1) {
 //
 //    // Do a triple-flip.
 //    ...
 //}
 //else {
 //    return false;
 //}


2.7.3        文档注释

文档注释描述Java的类、接口、构造器,方法,以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中,一个注释对应一个类、接口或成员。该注释应位于声明之前:

 /**

  * The Example class provides ...

  */

 public class Example { ...

       

注意顶层(top-level)的类和接口是不缩进的,而其成员是缩进的。描述类和接口的文档注释的第一行(/**)不需缩进;随后的文档注释每行都缩进1(使星号纵向对齐)。成员,包括构造函数在内,其文档注释的第一行缩进4格,随后每行都缩进5格。

若你想给出有关类、接口、变量或方法的信息,而这些信息又不适合写在文档中,则可使用实现块注释或紧跟在声明后面的单行注释。例如,有关一个类实现的细节,应放入紧跟在类声明后面的实现块注释中,而不是放在文档注释中。

文档注释不能放在一个方法或构造器的定义块中,因为Java会将位于文档注释之后的第一个声明与其相关联。

2.7.4        快速浏览 javadoc

javadoc 的程序可以处理 Java 的源代码文件,并且为 Java 程序产生 HTML 文件形式的外部注释文档。Javadoc 支持一定数目的标记,标识注释文档中各段起始位置的保留字。详情请参考J2SDK javadoc 文档。

标记

用于

目的

@author name

类、

接口

说明特定某一段程序代码的作者。每一个作者各有一个标记。

@deprecated

类、

成员函数

说明该类的应用程序编程接口 (API) 已被废弃,因此应不再使用。

@exception name description

成员函数

说明由成员函数发出的异常。一个异常采用一个标记,并要给出异常的完整类名。

@param name description

成员函数

用来说明传递给一个成员函数的参数,其中包括参数的类型/类和用法。每个参数各有一个标记。

@return description

成员函数

若成员函数有返回值,对该返回值进行说明。应说明返回值的类型/类和可能的用途。

@since

类、成员函数

说明自从有 JDK 1.1 以来,该项已存在了多长时间。

@see ClassName

类、接口、成员函数、字段

在文档中生成指向特定类的超文本链接。可以并且应该采用完全合法的类名。

@see ClassName#member functionName

类、接口、成员函数、字段

在文档中生成指向特定成员函数的超文本链接。可以并且应该采用完全合法的类名。

@version text

类、接口

说明特定一段代码的版本信息。


本文链接:领悟书生教程网,转自ajava.org

相关问答

更多
  • package test; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JOptionPane; /** * 你给的代码不全,看这有限的代码,应该是一个与模块移动有关的游戏 * @author sunjunjie * */ public class ButtonClick implements ActionList ...
  • package org.zcq100.test; import java.awt.*; import java.awt.event.*; import javax.swing.*; class TestGame { public static void main(String[] args) { App ap = new App(); //调用App()开始运行程序 ap.show(); } } class App extends JFrame { MainPanel mp; public App() { ...
  • 如果您在方法中声明了一个类型参数,则允许调用者为其选择实际类型,只要该实际类型将满足约束条件。 这种类型不一定是实际的具体类型,它可能是抽象类型,类型变量或交集类型,其他更为口语化的词是假设类型。 所以, 正如Mureinik所说 ,可能会有一个类型扩展String并实现List 。 我们无法手动指定调用的交集类型,但我们可以使用类型变量来演示逻辑: public class Main { public static > void mai ...
  • 导航到首选项→编辑器→代码样式→Java→包装和大括号选项卡 ,然后找到字段注释部分,然后选中单次注释后不要包装 。 在IntelliJ v14中: Navigate to Preferences → Editor → Code Style → Java → Wrapping and Braces tab, then locate the section Field annotations and check the option Do not wrap after single annotation. I ...
  • 使用Java Formatter( Windows > Preferences > Java > Code Style > Formatter ),您可以创建一个新的Formatter配置文件。 在“注释”选项卡(在eclipse3.5中),您可以确保在“ Javadoc comment settings ”中取消选中“ Format HTML tags ”。 另请参阅“ General settings ”部分中的“ Never join lines ”。 那么你的评论应该写成: /** * PSEUD ...
  • 而不是使用单个for循环。 你可以分成两个循环,外循环获取页面,内循环你可以进入修订。 for pageid, pagedetails in res["query"]["pages"].iteritems(): for revision in pagedetails["revisions"]: if revision["user"] == "TechBot": do.something() Instead of using a single for loop ...
  • 所有JVM内部都记录在JVM规范和相应的更新中: 版本5之前的Java JVM规范 Java 5 VM的规范更新 Java 6 VM的规范更新 更具体地说,在Java 5中引入了ACC_BRIDGE标志。请参见更新的类文件格式的第4.7节。 All JVM internals are documented in JVM specification and corresponding updates: JVM spec for Java before version 5 Spec updates for Ja ...
  • 至少Eclipse允许您使用(并定义自己的)标记放在注释中,之后可以轻松列出。 至少有TODO和XXX,但我相信你也可以做自己的。 At least Eclipse allows you to use (and define your own) markers put in comments, that can be easily listed afterwards. There's at least TODO and XXX, but I believe you could make your own a ...
  • 如果你在Java / JVM上有很多依赖,你可以考虑使用Jython 。 如果您想开发可扩展/可维护的应用程序,请考虑使用微服务并将Java和Python组件分开。 如果您对Java的调用很简单并且很容易捕获输出和失败,那么您可以继续执行此命令来调用Java部件。 If you have lot of dependcieis on Java/JVM, you can consider using Jython. If you would like to develop a scalable/maintain ...
  • 看起来您可以将inline_comment_prefixes指定为inline_comment_prefixes的参数。 当给出inline_comment_prefixes时,它将被用作在非空行中为注释添加前缀的子字符串集。 在python3.2中更改了此行为: 版本3.2中更改:在以前版本的configparser行为中,匹配的comment_prefixes=('#',';')和inline_comment_prefixes=(';',) 。 请注意,这也告诉您使用什么值来恢复旧行为;-)。 It l ...