常用规约

命名规范

首先,所有命名规则必须遵循以下规则:

  • 1)、名称只能由字母、数字、下划线、$ 符号组成
  • 2)、不能以数字开头
  • 3)、名称不能使用 Java 中的关键字。
  • 4)、坚决不允许出现中文及拼音命名。

对于不同的类、变量,又有不同的约定。

  • 项目名全部小写。
  • 包名全部小写。
  • 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写。如:public class MyFirstClass{}

package 的命名: package 的名字由全部小写的字母组成,例如:com.test。

class 和 interface 的命名: class 和 interface 的名字由大写字母开头而其他字母都小写的单词组成,例如:Person,RuntimeException。

变量与常量

  • 变量名、方法名首字母小写,如果名称由多个单词组成,每个单词的首字母都要大写。如:
    int index=0;
    public void toString(){}Copy to clipboardErrorCopied
    
  • 常量名全部大写
    public static final String GAME_COLOR="RED";Copy to clipboardErrorCopied
    
  • class 变量的命名: 变量的名字用一个小写字母开头,后面的单词用大写字母开头,例如:index,currentImage。
  • class 方法的命名: 方法的名字用一个小写字母开头,后面的单词用大写字母开头,例如:run(),getBalance()。
  • static final 变量的命名: static final 变量的名字所有字母都大写,并且能表示完整含义。例如:PI,PASSWORD。
  • 参数的命名: 参数的名字和变量的命名规范一致。
  • 数组的命名: 数组应该总是用这样的方式来命名:byte[] buffer。

注释规范

Java 支持三种注释方式。前两种分别是 // 和 /* */,第三种被称作说明注释,它以 /** 开始,以 */ 结束。说明注释允许你在程序中嵌入关于程序的信息。你可以使用 javadoc 工具软件来生成信息,并输出到 HTML 文件中。说明注释,使你更加方便的记录你的程序信息。

| 标签 | 描述 | 示例 |

| :-------------- | :-------------------------------------------------------: | :---------------------------------------------------------------: |

| @author | 标识一个类的作者 | @author description |

| @deprecated | 指名一个过期的类或成员 | @deprecated description |

| {@docRoot} | 指明当前文档根目录的路径 | Directory Path |

| @exception | 标志一个类抛出的异常 | @exception exception-name explanation |

| {@inheritDoc} | 从直接父类继承的注释 | Inherits a comment from the immediate surperclass. |

| {@link} | 插入一个到另一个主题的链接 | {@link name text} |

| {@linkplain} | 插入一个到另一个主题的链接,但是该链接显示纯文本字体 | Inserts an in-line link to another topic. |

| @param | 说明一个方法的参数 | @param parameter-name explanation |

| @return | 说明返回值类型 | @return explanation |

| @see | 指定一个到另一个主题的链接 | @see anchor |

| @serial | 说明一个序列化属性 | @serial description |

| @serialData | 说明通过 writeObject( ) 和 writeExternal( )方法写的数据 | @serialData description |

| @serialField | 说明一个 ObjectStreamField 组件 | @serialField name type description |

| @since | 标记当引入一个特定的变化时 | @since release |

| @throws | 和 @exception 标签一样. | The @throws tag has the same meaning as the @exception tag. |

| {@value} | 显示常量的值,该常量必须是 static 属性。 | Displays the value of a constant, which must be a static field. |

| @version | 指定类的版本 | @version info |

类注释

在每个类前面必须加上类注释,注释模板如下:

/**
* Copyright (C), 2006-2010, NGTE info. Co., Ltd.
* FileName: Test.java
* 类的详细说明
*
* @Date    创建日期
* @version 1.00
*/Copy to clipboardErrorCopied

属性注释

在每个属性前面必须加上属性注释,注释模板如下:

/** 提示信息 */
private String strMsg = null;Copy to clipboardErrorCopied

方法注释

在每个方法前面必须加上方法注释,注释模板如下:

/**
* 类方法的详细使用说明
*
* @param 参数1 参数1的使用说明
* @return 返回结果的说明
* @throws 异常类型.错误代码 注明从此类方法中抛出异常的说明
*/Copy to clipboardErrorCopied

在每个构造方法前面必须加上注释,注释模板如下:

/**
* 构造方法的详细使用说明
*
* @param 参数1 参数1的使用说明
* @throws 异常类型.错误代码 注明从此类方法中抛出异常的说明
*/Copy to clipboardErrorCopied

在方法内部使用单行或者多行注释,该注释根据实际情况添加。

//背景颜色
Color bgColor = Color.RED

性能优化

并发编程

Java 中所有变量都存储在主存中,并对所有线程共享。线程都有自己的私有工作内存,保存主存中某些变量的拷贝。线程对所有变量的操作都是在工作内存中进行。线程之间无法相互直接访问,变量传递均需要通过主存完成。安全的同步共享数据必须使用锁机制。

所谓的编程规范与样式指南即是希望通过制定对语言常见特性和使用注意事项的细则描述,提升编程技能,保证项目的可维护、易重构、易理解、易实现等特性。

Lambda

避免过度臃肿的 Lambda 实现

在将早期的代码迁移到 Java 8 中基于 Lambda 的函数式风格时,往往会生硬地将类中的代码迁移过去:

List<Person> persons = ...;
persons.stream().filter(p -> {
    if (p.getGender() == Gender.MALE) {
        return true;
    }
    LocalDate now = LocalDate.now();
    Duration age = Duration.between(p.getBirthDate(), now);
    Duration adult = Duration.of(18, ChronoUnit.YEARS);
    if (age.compareTo(adult) > 0) {
        return true;
    }
    return false;
}).map(p -> p.getFirstName() + " " + p.getLastName())
  .collect(Collectors.toList());Copy to clipboardErrorCopied

作为典型的面向对象的语言,我们还是应该将与对象相关的代码封装到类中:

public class Person {
  // ...
  public boolean isMale() {
    return getGender() == Gender.MALE;
  }
  public boolean isAdult(LocalDate when) {
    Duration age = Duration.between(birthDate, when);
    Duration adult = Duration.of(18, ChronoUnit.YEARS);
    return age.compareTo(adult) > 0;
  }
}Copy to clipboardErrorCopied

然后简要地提升下 Lambda 以及 Stream 代码的可读性:

// Implementation details
Predicate<Person> isMaleOrAdult = p -> {
    if (p.isMale()) {
        return true;
    }
    LocalDate now = LocalDate.now();
    if (p.isAdult(now)) {
        return true;
    }
    return false;
};
Function<Person, String> concatenateFirstAndLastName = p -> p.getFirstName() + " " + p.getLastName();
// Core
persons.stream().filter(isMaleOrAdult).map(concatenateFirstAndLastName)
下一节:JSR,全称 Java Specification Requests,即 Java 规范提案,主要是用于向 JCP(Java Community Process)提出新增标准化技术规范的正式请求。每次 JAVA 版本更新都会有对应的 JSR 更新,比如在 Java 8 版本中,其新特性 Lambda 表达式对应的是 JSR 335,新的日期和时间 API 对应的是 JSR 310。当然,本文的关注点仅仅是 JSR 166,它是一个关于 Java 并发编程的规范提案,在 JDK 中,该规范由 java.util.concurrent 包实现,是在 JDK 5.0 的时候被引入的;另外 JDK6 引入 Deques、Navigable collections,对应的是 JSR 166x,JDK7 引入 fork-join 框架,用于并行执行任务,对应的是 JSR 166y。

J.U.C. 即 java.util.concurrent 的缩写,该包参考自 EDU.oswego.cs.dl.util.concurrent,是 JSR 166 标准规范的一个实现;