软件系统JAVA
编码规范
版本V1.0
文档信息:
内容范围:
本文档是软件系统JAVA编码规范。适用的对象:
公司相关技术人员。
目录
1 介绍(INTRODUCTION) (5)
2 2 文件名(FILE NAMES) (6)
2.1文件后缀(F ILE S UFFIXES) (6)
2.2常用文件名(C OMMON F ILE N AMES) (6)
3 文件组织(FILE ORGANIZATION) (7)
3.1J AVA源文件(J AVA S OURCE F ILES) (7)
3.1.1开首注释(B EGINNING C OMMENTS) (7)
3.1.2包和引入语句(P ACKAGE AND I MPORT S TATEMENTS) (8)
3.1.3类和接口声明(C LASS AND I NTERFACE D ECLARATIONS) (8)
4 缩进排版(INDENTATION) (9)
4.1行长度(L INE L ENGTH) (9)
4.2换行(W RAPPING L INES) (9)
5 注释(COMMENTS) (13)
5.1实现注释的格局(I MPLEMENTATION C OMMENT F ORMATS) (13)
5.1.1块注释(B LOCK C OMMENTS) (13)
5.1.2单行注释(S INGLE-L INE C OMMENTS) (14)
5.1.3尾端注释(T RAILING C OMMENTS) (15)
5.1.4行末注释(E ND-O F-L INE C OMMENTS) (15)
5.2文档注释(D OCUMENTATION C OMMENTS) (16)
6 声明(DECLARATIONS) (17)
6.1每行声明变量的数量(N UMBER P ER L INE) (17)
6.2初始化(I NITIALIZATION) (17)
6.3布局(P LACEMENT) (17)
6.4类和接口的声明(C LASS AND I NTERFACE D ECLARATIONS) (18)
7 语句(STATEMENTS) (20)
7.1简单语句(S IMPLE S TATEMENTS) (20)
7.2复合语句(C OMPOUND S TATEMENTS) (20)
7.3返回语句(RETURN S TATEMENTS) (20)
7.4 IF,IF-ELSE,IF ELSE-IF ELSE语句 (20)
7.5 FOR语句(FOR S TATEMENTS) (21)
7.6 WHILE语句(WHILE S TATEMENTS) (22)
7.7 DO-WHILE语句(DO-WHILE S TATEMENTS) (22)
7.8 SWITCH语句(SWITCH S TATEMENTS) (22)
7.9 TRY-CATCH语句(TRY-CATCH S TATEMENTS) (23)
8 空白(WHITE SPACE) (25)
8.1空行(B LANK L INES) (25)
8.2空格(B LANK S PACES) (25)
9 定名规范(NAMING CONVENTIONS) (27)
10 编程实践(PROGRAMMING PRACTICES) (29)
10.1供给对实例以及类变量的接见把握 (29)
10.2引用类变量和类办法 (29)
10.3常量(C ONSTANTS) (29)
10.4变量赋值(V ARIABLE A SSIGNMENTS) (29)
10.5其它实战(M ISCELLANEOUS P RACTICES) (30)
10.5.1圆括号(P ARENTHESES) (30)
10.5.2返回值(R ETURNING V ALUES) (30)
10.5.3前提运算符"?"前的表达式 (31)
10.5.4特别注释(S PECIAL C OMMENTS) (31)
11 代码示例(CODE EXAMPLES) (32)
为什么要有编码规范(Why Have Code Conventions)?编码规范对于程序员而言尤为首要,主要有以下几个原因:
?一个软件的生命周期中,80%的花费在于维护
?几乎没有任何一个软件,在其全部生命周期中,均由最初的开辟人员来维护
?编码规范可以改良软件的可读性,可以让程序员尽快而彻底地懂得新的代码
?若是你将源码作为产品公布,就须要确任它是否被很好的打包并且清楚无误,一如你已构建的其它任何产品
为了履行规范,每个软件开辟人员必须一致遵守编码规范。
这项目组列出了常用的文件名及后缀。
2.1文件后缀(File Suffixes)
Java程序应用下列文件后缀:
表1:文件后缀规范表2.2常用文件名(Common File Names)
常用的文件名包含:
表2:常用文件名规范表
3 文件组织(F ILE O RGANIZATION)
一个文件由被空行分别而成的段落以及标识每个段落的可选注释共同构成。跨越2000行的程序难以浏览,应当尽量避免。"Java源文件典范"供给了一个布局公道的Java程序典范。
3.1Java源文件(Java Source Files)
每个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相接洽关系,可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类或接口。
Java源文件还遵守以下规矩:
?开首注释(拜见"开首注释")
?包和引入语句(拜见"包和引入语句")
?类和接口声明(拜见"类和接口声明")
3.1.1 开首注释(Beginning Comments)
所有的源文件都应当在开首有一个C说话风格的注释,此中列出类名、版本信息、日期和版权声明:
/*
* Classname
*
* Version information
*
* Date
*
* Copyright notice
*/
3.1.2 包和引入语句(Package and Import Statements)
在多半Java源文件中,第一个非注释行是包语句。在它之后可以跟引入语句。例如:
package java.awt;
import java.awt.peer.CanvasPeer;
3.1.3 类和接口声明(Class and Interface Declarations)
下表描述了类和接口声明的各个项目组以及它们呈现的先后次序。拜见"Java 源文件典范"中一个包含注释的例子。
表3:类和接口声明规范表
4 缩进排版(I NDENTATION)
4个空格常被作为缩进排版的一个单位。缩进的确切申明并未具体指定(空格vs. 制表符)。一个制表符便是8个空格(而非4个)。
4.1行长度(Line Length)
尽量避免一行的长度跨越80个字符,因为很多终端和对象不克不及很益处理惩罚之。
重视:用于文档中的例子应当应用更短的行长,长度一般不跨越70个字符。
4.2换行(Wrapping Lines)
当一个表达式无法容纳在一行内时,可以根据如下一般规矩断开之:
?在一个逗号后面断开
?在一个操纵符前面断开
?宁可选择较高等别(higher-level)的断开,而非较初级别(lower-level)的断开
?新的一行应当与上一行同一级别表达式的开首处对齐
?若是以上规矩导致你的代码杂沓或者使你的代码都堆挤在右边,那就代之以缩进8个空格。
以下是断创办法调用的一些例子:
someMethod(longExpression1,longExpression2,longExpression3,
longExpression4,longExpression5);
var = someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
【译者注】上方是SUN(Oracle)网站上html版起原根蒂根基始写法,笔者
看了半天是一头雾水;对比pdf版本看,才发明是SUN的html版本写的不合错误:亦即,新的一行在上一行同一级别表达式的开首对齐:longExpression4与longExpression1对齐;someMethod2与longExpression1对齐,longExpression3与longExpression2对齐:
someMethod(longExpression1,longExpression2,longExpression3,
longExpression4,longExpression5);
var = someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
以下是两个断开算术表达式的例子。前者更好,因为断开处位于括号表达式的外边,这是个较高等此外断开。
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; //PREFFER
longName1 = longName2 * (longName3 + longName4
- longName5)+ 4 * longname6; //A VOID 【译者注】上方是SUN(Oracle)网站上html版起原根蒂根基始写法,笔者看了半天是一头雾水;对比pdf版本看,才发明是SUN的html版本写的不合错误:亦即,新的一行在上一行同一级别表达式的开首对齐:加号与longName2对齐;减号与longName3对齐(固然分行的处所不合错误,但书写还是要对齐的)。
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; //PREFFER
longName1 = longName2 * (longName3 + longName4
- longName5)+ 4 * longname6; //A VOID 以下是两个缩进办法声明的例子。前者是常规景象。后者若应用常规的缩进体式格式将会使第二行和第三行移得很靠右,所以代之以缩进8个空格//CONVENTIONALINDENTATION
someMethod(int anArg,Object anotherArg,String yetAnotherArg,
Object andStillAnother){
...
}
//INDENT 8 SPACESTO A VOID VERY DEEP INDENTS
private static synchronized horkingLongMethodName(int anArg,
Object anotherArg,String yetAnotherArg,
Object andStillAnother){
...
}
if语句的换行凡是应用8个空格的规矩,因为常规缩进(4个空格)会使语句体看起来斗劲费劲。比如:
//DON’T USE THISIN DENTATION
if ((condition1&& condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)){ //BAD WRAPS
doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS }
//USE THISINDENTATION INSTEAD
if ((condition1&& condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)){
doSomethingAboutIt();
}
//OR USE THIS
if ((condition1&& condition2)|| (condition3 && condition4)
||!(condition5 && condition6)){
doSomethingAboutIt();
}
这里有三种可行的办法用于处理惩罚三元运算表达式:alpha = aLongBooleanExpression)?beta : gamma; alpha = (aLongBooleanExpression)?beta
: gamma;
alpha = (aLongBooleanExpression)
?beta
: gamma;
5 注释(C OMMENTS)
Java程序有两类注释:实现注释(implementation comments)和文档注释(document comments)。实现注释是那些在C++中见过的,应用/*...*/和//界定的注释。文档注释(被称为"doc comments")是Java独有的,并由/**...*/界定。文档注释可以经由过程javadoc对象转换成HTML文件。
实现注释用以注释代码或者实现细节。文档注释从实现(implementation-free)的角度描述代码的规范。它可以被那些手头没有源码的开辟人员读懂。
注释应被用来给出代码的总括,并供给代码自身没有供给的附加信息。注释应当仅包含与浏览和懂得程序有关的信息。例如,响应的包如何被建树或位于哪个目次下之类的信息不该包含在注释中。
在注释里,对设计决定计划中首要的或者不是显而易见的处所进行申明是可以的,但应避免供给代码中己清楚表达出来的反复信息。多余的的注释很轻易过期。凡是应避免那些代码更新就可能过期的注释。
重视:频繁的注释有时反应出代码的低质量。当你感觉被迫要加注释的时辰,推敲一下重写代码使其更清楚。
注释不该写在用星号或其他字符画出来的大框里。注释不该包含诸如制表符和回退符之类的特别字符。
5.1实现注释的格局(Implementation Comment Formats)
程序可以有4种实现注释的风格:块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)。
5.1.1 块注释(Block Comments)
块注释凡是用于供给对文件,办法,数据布局和算法的描述。块注释被置于每个文件的开端处以及每个办法之前。它们也可以被用于其他处所,比如办法内部。在功能和办法内部的块注释应当和它们所描述的代码具有一样的缩进格局。
块注释之首应当有一个空行,用于把块注释和代码分别开来,比如:
/*
* Here is ablock comment.
*/
块注释可以以/*-开首,如许indent(1)就可以将之辨认为一个代码块的开端,而不会重排它。
/*-
* Here is ablock comment with some very special
* formattingthat I want indent(1)to ignore.
*
* one
* two
* three
*/
重视:若是你不应用indent(1),就不必在代码中应用/*-,或为他人可能对你的代码运行indent(1)作让步。
拜见"文档注释"
5.1.2 单行注释(Single-Line Comments)
短注释可以显示在一行内,并与厥后的代码具有一样的缩进层级。若是一个注释不克不及在一行内写完,就该采取块注释(拜见"块注释")。单行注释之前应当有一个空行。以下是一个Java代码中单行注释的例子:
if (condition){
/* Handle thecondition. */
...
}
5.1.3 尾端注释(Trailing Comments)
极短的注释可以与它们所要描述的代码位于同一行,然则应当有足够的空白来分隔代码和注释。如有多个短注释呈现于大段代码中,它们应当具有雷同的缩进。
以下是一个Java代码中尾端注释的例子:
if (a == 2){
return TRUE; /* special case */
} else {
return isPrime(a); /* works only for odda */
}
5.1.4 行末注释(End-Of-Line Comments)
注释界定符"//",可以注释掉整行或者一行中的一项目组。它一般不消于连续多行的注释文本;然而,它可以用来注释掉连续多行的代码段。以下是所有三种风格的例子:
if (foo > 1){
// Do adouble-flip.
...
}
else {
return false; // Explain why here.
}
//if (bar > 1){
//
// // Do a triple-flip.
// ...
//}
//else {
// return false;
//}
5.2文档注释(Documentation Comments)
文档注释描述Java的类、接口、机关器,办法,以及字段(field)。每个文档注释都邑被置于注释定界符/**...*/之中,一个注释对应一个类、接口或成员。该注释应位于声明之前:
/**
* The Exampleclass provides ...
*/
public classExample { ...
重视顶层(top-level)的类和接口是不缩进的,而其成员是缩进的。描述类和接口的文档注释的第一行(/**)不需缩进;随后的文档注释每行都缩进1格(使星号纵向对齐)。成员,包含机关函数在内,其文档注释的第一行缩进4格,随后每行都缩进5格。
若你想给出有关类、接口、变量或办法的信息,而这些信息又不合适写在文档中,则可应用实现块注释(见5.1.1)或紧跟在声明后面的单行注释(见5.1.2)。例如,有关一个类实现的细节,应放入紧跟在类声明后面的实现块注释中,而不是放在文档注释中。
文档注释不克不及放在一个办法或机关器的定义块中,因为Java会将位于文档注释之后的第一个声明与其相接洽关系。
6 声明(D ECLARATIONS)
6.1每行声明变量的数量(Number Per Line)
推荐一行一个声明,因为如许以利于写注释。亦即:
int level; // indentation level
int size; // size of table
要优于,
int level,size;
不要将不合类型变量的声明放在同一行,例如:
int foo,fooarray[]; //WRONG!
重视:上方的例子中,在类型和标识符之间放了一个空格,另一种被容许的调换体式格式是应用制表符:
int level; // indentation level
int size; // size of table
Object currentEntry; // currently ed table entry
6.2初始化(Initialization)
尽量在声明局部变量的同时初始化。独一不这么做的来由是变量的初始值依附于某些先前产生的策画。
6.3布局(Placement)
只在代码块的开端处声明变量。(一个块是指任何被包含在大括号"{"和"}"中心的代码。)不要在初次用到该变量时才声明之。这会把重视力不集中的程序员搞糊涂,同时会故障代码在该感化域内的可移植性。
void myMethod(){
int int1 = 0; // beginning of method block
if (condition){
int int2 = 0; // beginning of "if"block
...
}
}
该规矩的一个例外是for轮回的索引变量
for (int i = 0; i < maxLoops; i++){ ... }
避免声明的局部变量覆盖上一级声明的变量。例如,不要在内部代码块中声明雷同的变量名:
int count;
...
myMethod(){
if (condition){
int count= 0; // A VOID!
...
}
...
}
6.4类和接口的声明(Class and Interface Declarations)
当编写类和接口是,应当遵守以下格局规矩:
?在办法名与其参数列表之前的左括号"(间隔不要有空格),左大括号"{"
位于声明语句同业的末尾,右大括号"}"另起一行,与响应的声明语句对齐,除非是一个空语句,"}"应紧跟在"{"之后。
class Sample extends Object {
int ivar1;
int ivar2;
Sample(int i,int j){
ivar1 = i;
ivar2 = j;
}
int emptyMethod(){}
...
}
?办法与办法之间以空行进行分隔。
7 语句(S TATEMENTS)
7.1简单语句(Simple Statements)
每行至多包含一条语句,例如:
argv++; // Correct
argc--; // Correct
argv++; argc--; // A VOID!
7.2复合语句(Compound Statements)
复合语句是包含在大括号中的语句序列,形如"{ 语句}"。例如下面各段。
?放在括号中的语句应当较之复合语句缩进一个层次,左大括号"{"应位于复合语句肇端行的行尾;右大括号"}"应另起一行并与复合语句首行对齐;
大括号可以被用于所有语句,包含单个语句,只要这些语句是诸如if-else 或for把握布局的一项目组。如许便于添加语句而无需愁闷因为忘了加括号而引入bug。
7.3返回语句(return Statements)
一个带返回值的return语句不应用小括号"()",除非它们以某种体式格式使返回值更为显见。例如
return;
return myDisk.size();
return (size ?size : defaultSize);
7.4 if,if-else,if else-if else语句
if-else语句应当具有如下格局:
if (condition){