JAVA程序编码要求规范.docx

上传人:b****4 文档编号:6345347 上传时间:2023-05-09 格式:DOCX 页数:18 大小:25.02KB
下载 相关 举报
JAVA程序编码要求规范.docx_第1页
第1页 / 共18页
JAVA程序编码要求规范.docx_第2页
第2页 / 共18页
JAVA程序编码要求规范.docx_第3页
第3页 / 共18页
JAVA程序编码要求规范.docx_第4页
第4页 / 共18页
JAVA程序编码要求规范.docx_第5页
第5页 / 共18页
JAVA程序编码要求规范.docx_第6页
第6页 / 共18页
JAVA程序编码要求规范.docx_第7页
第7页 / 共18页
JAVA程序编码要求规范.docx_第8页
第8页 / 共18页
JAVA程序编码要求规范.docx_第9页
第9页 / 共18页
JAVA程序编码要求规范.docx_第10页
第10页 / 共18页
JAVA程序编码要求规范.docx_第11页
第11页 / 共18页
JAVA程序编码要求规范.docx_第12页
第12页 / 共18页
JAVA程序编码要求规范.docx_第13页
第13页 / 共18页
JAVA程序编码要求规范.docx_第14页
第14页 / 共18页
JAVA程序编码要求规范.docx_第15页
第15页 / 共18页
JAVA程序编码要求规范.docx_第16页
第16页 / 共18页
JAVA程序编码要求规范.docx_第17页
第17页 / 共18页
JAVA程序编码要求规范.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

JAVA程序编码要求规范.docx

《JAVA程序编码要求规范.docx》由会员分享,可在线阅读,更多相关《JAVA程序编码要求规范.docx(18页珍藏版)》请在冰点文库上搜索。

JAVA程序编码要求规范.docx

JAVA程序编码要求规范

JAVA程序编码规X

 

1简介

1.1目的

本规X为一套编写高效可靠的Java代码的标准、约定和指南。

它以安全可靠的软件工程原如此为根底,使代码易于理解、维护和增强,提高生产效率。

同时,将带来更大的一致性,使软件开发团队的效率明显提高。

1.2X围

本规X应用于采用J2EE规X的项目中,所有项目中的JAVA代码〔含JSP,SERVLET,JAVABEAN〕均应遵守这个规X。

同时,也可作为其它项目的参考。

代码组织与风格

1.3Tab

一个Tab为4个空格长。

1.4缩进

一个代码块内的代码都应该统一的缩进一个Tab长度。

1.5空行

适当的增加空行,来增加代码的可读性。

在如下情况下应该有两行空行:

        同一文件的不同局部之间;

        在类,接口以与彼此之间;

在如下情况之间应该有一行空行:

        方法之间;

        局部变量和它后边的语句之间;

        方法内的功能逻辑局部之间;

1.6代码块长度

每个代码块尽量控制在1个屏幕之内,方便浏览。

1.7行宽

每行代码和注释不应超过70个字节或屏幕的宽度,如超过如此应换行,换行后的代码应该缩进8个字符。

1.8空格

括号和它里面的字符之间不应该出现空格。

括号应该和它前边的关键词留有空格,如:

while(true)

{

};

但是方法名和左括号之间不应该有空格。

参数之间的逗号后应该加一空格。

如:

method1(inti1,inti2)

for语句里的表达式之间加一空格。

如:

for(expr1;expr2;expr3)

二元操作符和操作数之间应该用空格隔开。

如:

i+c;

强制类型转换时,在类型和变量之间加一空格。

如:

(int)i;注释

1.9注释的根本约定

注释应该增加代码的清晰度

持注释的简洁,不是任何代码都需要注释的,过多的注释反而会影响代码的可读性。

注释不应该包括其他的特殊字符。

先写注释,后写代码

1.10注释类型

块注释:

主要用来描述文件,类,方法,算法等。

一般用在文档和方法的前面,也可以放在文档的任何地方。

以‘/*’开头,‘*/’结尾。

例:

……

/*

*注释

*/

……

行注释:

主要用在方法内部,对代码,变量,流程等进展说明。

与块注释格式相似,但是整个注释占据一行。

例:

……

/*注释*/

……

尾随注释:

与行注释功能相似,放在代码的同行,但是要与代码之间有足够的空间,便于分清。

例:

intm=4;/*注释*/

如果一个程序块内有多个尾随注释,每个注释的缩进应该保持一致。

行尾注释:

与行注释功能相似,放在每行的最后,或者占据一行。

以‘//’开头。

文档注释:

与块注释相似,但是可以被javadoc处理,生成HTML文件。

以‘/**’开头,‘*/’结尾。

问挡住是不能放在方法或程序块内。

例:

/**

*注释

*/

1.11注释那些局部

项目

注释哪些局部

实参/

参数

参数类型参数用来做什么任何约束或前提条件

示例

字段/

字段/属性

字段描述注释所有使用的不变量示例并行事件

可见性决策

类的目的的问题类的开发/维护历史注释出采用的不变量

并行策略

编译单元

每一个类/类内定义的接口,含简单的说明文件名和/或标识信息

信息

接口

目的

它应如何被使用以与如何不被使用 

局部变量

用处/目的

成员函数注释

成员函数做什么以与它为什么做这个

哪些参数必须传递给一个成员函数成员函数返回什么的问题任何由某个成员函数抛出的异常可见性决策成员函数是如何改变对象的包含任何修改代码的历史如何在适当情况下调用成员函数的例子适用的前提条件和后置条件 

成员函数内部注释

控制结构代码做了些什么以与为什么这样做局部变量难或复杂的代码处理顺序 

2命名

2.1命名的根本约定

一般应该使用可以准确说明变量/字段/类的完整的英文描述符,如firstName。

对一些作用显而易见的变量可以采用简单的命名,如在循环里的递增〔减〕变量就可以被命名为〞i〞。

尽量采用项目所涉与领域的术语。

可以采用大小写混合,提高名字的可读性。

尽量少用缩写,但如果一定要使用,就要慎重地使用。

同时,应该保存一个标准缩写的列表,并且在使用时保持一致。

防止使用长名字〔最好不超过15个字母〕。

防止使用相似或者仅在大小写上有区别的名字。

防止使用下划线作为名字的首末字母。

2.2标识符的命名约定

标示符类型

命名约定

例子

全部小写。

标识符用点号分隔开来。

为了使包的名字更易读,Sun公司建议包名中的标识符用点号来分隔。

Sun公司的标准java分配包用标识符.java开头。

全局包的名字用你的机构的Internet保存域名开头。

局部包:

全局包:

.rational.

类,接口

类的名字应该使用名词。

每个单词第一个字母应该大写。

防止使用单词的错写,除非它的缩写已经广为人知,如HTTP。

ClassHello;

ClassHelloWorld;

InterfaceApple;

方法

第一个单词一般是动词。

第一个字母是小些,但是中间单词的第一个字母是大写。

如果方法返回一个成员变量的值,方法名一般为get+成员变量名,如假如返回的值是bool变量,一般以is作为前缀。

如果方法修改一个成员变量的值,方法名一般为:

set+成员变量名。

 

getName();

setName();

isFirst();

变量

第一个字母小写,中间单词的第一个字母大写。

不要用_或&作为第一个字母。

尽量使用短而且具有意义的单词。

单字符的变量名一般只用于生命期非常短暂的变量。

i,j,k,m,n一般用于integers;c,d,e一般用于characters。

如果变量是集合,如此变量名应用复数。

命名组件采用匈牙利命名法,所有前缀均应遵循同一个组件名称缩写列表。

StringmyName;

  

inti;

intn;

charc;

 

int[]students;

 

btNew;

(bt是Button的缩写)

常量

所有常量名均全部大写,单词间以‘_’隔开。

intMAX_NUM;

3声明

每行应该只有一个声明。

局部变量必须初始化。

除了for循环外,声明应该放在块的最开始局部。

for循环中的变量声明可以放在for语句中。

如:

for(inti=0;i<10;i++)。

防止块内部的变量与它外部的变量名一样。

表达式和语句

3.1每行应该只有一条语句。

3.2if-else

if-elseif语句,任何情况下,都应该有“{〞,“}〞,格式如下:

if(condition){

statements;

}elseif(condition){

statements;

}else{

statements;

}

3.3for语句

格式如下:

for(initialization;condition;update){

statements;

}

如果语句为空:

for(initialization;condition;update);

3.4while语句

格式如下:

while(condition){

statements;

}

如果语句为空:

while(condition);

3.5do-while语句

格式如下:

do{

statements;

}

while(condition);

3.6switch语句

每个switch里都应包含default子语句,格式如下:

switch(condition){

caseABC:

statements;

/*fallsthrough*/

caseDEF:

statements;

break;

caseXYZ:

statements;

break;

default:

statements;

break;

}

3.7try-catch语句

格式如下:

try{

statements;

}catch(ExceptionClasse){

statements;

}finally{

statements;

}

4错误处理和异常事件

通常的思想是只对错误采用异常处理:

逻辑和编程错误,设置错误,被破坏的数据,资源耗尽,等等。

通常的法如此是系统在正常状态下以与无重载和硬件失效状态下,不应产生任何异常。

异常处理时可以采用适当的日志机制来报告异常,包括异常发生的时刻。

不要使用异常实现来控制程序流程结构。

 可移植性

4.1尽量不要使用已经被标为不赞成使用的类或方法。

4.2代码应遵循UNIX风格。

4.3如果需要换行的话,尽量用println来代替在字符串中使用"\n"。

4.4用separator()方法代替路径中的〞/〞或〞\〞。

4.5用pathSeptarator()方法代替路径中的〞:

〞或〞;〞。

5Java 文件样式 

所有的 Java(*.java) 文件都必须遵守如下的样式规如此 

5.1信息 

信息必须在 java 文件的开头,比如:

 

/**

*

Title:

本文件的标题

*

Description:

对本文件的描述

*

Copyright:

信息

*

pany:

公司名称

*author作者Email

*version版本号

*/

其他不需要出现在 javadoc 的信息也可以包含在这里。

5.2Package/Imports 

package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。

如果 import 行中包含了同一个包中的不同子目录,如此应该用 * 来处理。

 如:

package .stats;

import java.io.*;

import java.util.Observable;

import hotlava.util.Application;

这里 java.io.* 使用来代替InputStream and OutputStream 的。

5.3Class 

接下来的是类的注释,一般用来解释类的作用。

 

/**

 * A class representing a set of packet and byte counters

 * It is observable to allow it to be watched, but only

 * reports changes when the current set is plete

 */

接下来是类定义,包含了在不同的行的 extends 和 implements 。

一般应遵循extends在前,implements在后的原如此。

如:

public class CounterSetextends Observableimplements Cloneable

5.4Class Fields 

接下来是类的成员变量:

/**

 * Packet counters

 */

protected int[] packets;

public 的成员变量必须生成文档〔JavaDoc〕。

proceted、private和 package 定义的成员变量如果名字含义明确的话,可以没有注释。

5.5存取方法 

接下来是类变量的存取的方法。

它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。

 /**

 * Get the counters

 * return an array containing the statistical data.  This array has been

 * freshly allocated and can be modified by the caller.

 */

public int[] getPackets() { return copyArray(packets, offset); }

public int[] getBytes() { return copyArray(bytes, offset); }

public int[] getPackets() { return packets; }

public void setPackets(int[] packets) { this.packets = packets; }

其它的方法不要写在一行上。

5.6构造函数 

接下来是构造函数,它应该用递增的方式写〔比如:

参数多的写在后面〕。

 访问类型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。

 

publicstatic

CounterSet(int size){

  this.size = size;

}

5.7克隆方法

如果这个类是可以被克隆的,那么下一步就是 clone 方法:

publicObject clone() {

  try {

    CounterSet obj = (CounterSet)super.clone();

    obj.packets = (int[])packets.clone();

    obj.size = size;

    return obj;

  }catch(CloneNotSupportedException e) {

    throw new InternalError("Unexpected CloneNotSUpportedException:

 " + e.getMessage());

}

}

5.8类方法 

下面开始写类的方法:

 

/**

*Createsanewzipentrywiththespecifiedname.

*

*paramnametheentryname

*exceptionNullPointerExceptioniftheentrynameisnull

*exceptionIllegalArgumentExceptioniftheentrynameislongerthan

*0xFFFFbytes

*/

publicZipEntry(Stringname)

{

if(name==null)

{

thrownewNullPointerException();

}

if(name.length()>0xFFFF)

{

thrownewIllegalArgumentException("entrynametoolong");

}

this.name=name;

}

5.9toString 方法

无论如何,每一个类都应该定义 toString 方法:

 

publicString toString() {

  String retval = "CounterSet:

 ";

    for (int i = 0; i < data.length(); i++) {

      retval += data.bytes.toString();

      retval += data.packets.toString();

    }

    return retval;

}

5.10main 方法 

如果main(String[]) 方法已经定义了, 那么它应该写在类的底部. 程序编写规X

5.11exit()

exit 除了在 main 中可以被调用外,其他的地方不应该调用。

因为这样做不给任何代码代码机会来截获退出。

一个类似后台服务地程序不应该因为某一个库模块决定了要退出就退出。

 

异常

申明的错误应该抛出一个RuntimeException或者派生的异常。

 顶层的main()函数应该截获所有的异常,并且打印〔或者记录在日志中〕在屏幕上。

5.12垃圾收集

JAVA使用成熟的后台垃圾收集技术来代替引用计数。

但是这样会导致一个问题:

你必须在使用完对象的实例以后进展清场工作。

比如一个prel的程序员可能这么写:

...

{

FileOutputStream fos = new FileOutputStream(projectFile);

project.save(fos, "IDE Project File"); 

}

...

除非输出流一出作用域就关闭,非引用计数的程序语言,比如JAVA,是不能自动完成变量的清场工作的。

必须象下面一样写:

 FileOutputStream fos = new FileOutputStream(projectFile);

project.save(fos, "IDE Project File"); 

fos.close();

5.13Clone 

下面是一种有用的方法:

 

implements Cloneable

publicObject clone()

{

      try {

        ThisClass obj = (ThisClass)super.clone();

        obj.field1 = (int[])field1.clone();

        obj.field2 = field2;

        return obj;

      } catch(CloneNotSupportedException e) {

        throw new InternalError("Unexpected CloneNotSUpportedException:

 " + e.getMessage());

      }

  }

5.14final 类 

绝对不要因为性能的原因将类定义为 final 的〔除非程序的框架要求〕 如果一个类还没有准备好被继承,最好在类文档中注明,而不要将她定义为 final 的。

这是因为没有人可以保证会不会由于什么原因需要继承她。

5.15访问类的成员变量 

大局部的类成员变量应该定义为 protected 的来防止继承类使用他们。

 注意,要用"int[] packets",而不是"int packets[]",后一种永远也不要用。

 

public void setPackets(int[] packets) { this.packets = packets; }

CounterSet(int size)

{

  this.size = size;

}

6编程技巧 

6.1byte 数组转换到characters

为了将 byte 数组转换到 characters,你可以这么做:

"Hello world!

".getBytes(); 

6.2Utility 类

Utility 类〔仅仅提供方法的类〕应该被申明为抽象的来防止被继承或被初始化。

 

6.3初始化 

下面的代码是一种很好的初始化数组的方法:

objectArguments = new Object[] { arguments }; 

6.4枚举类型 

JAVA 对枚举的支持不好,但是下面的代码是一种很有用的模板:

class Colour {

  public static final Colour BLACK = new Colour(0, 0, 0);

  public static final Colour RED = new Colour(0xFF, 0, 0);

  public static final Colour GREEN = new Colour(0, 0xFF, 0);

  public static final Colour BLUE = new Colour(0, 0, 0xFF);

  public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);

}

这种技术实现了RED, GREEN, BLUE 等可以象其他语言的枚举类型一样使用的常量。

 他们可以用 '==' 操作符来比拟。

 但是这样使用有一个缺陷:

如果一个用户用这样的方法来创建颜色 BLACK 

new Colour(0,0,0) 

那么这就是另外一个对象,'=='操作符就会产生错误。

她的 equal() 方法仍然有效。

由于这个原因,这个技术的缺陷最好注明在文档中,或者只在自己的包中使用。

 

6.5Swing 

防止使用 AWT 组件 混合使用 AWT 和 Swing 组件 如果要将 AWT 组件和 Swing 组件混合起来使用的话,请小心使用。

实际上,尽量不要将他们混合起来使用。

 滚动的 AWT 组件 AWT 组件绝对不要用 JscrollPane 类来实现滚动。

滚动 AWT 组件的时候一定要用 AWT ScrollPane 组件来实现。

 防止在 InternalFrame 组件中使用 AWT 组件 尽量不要这么做,要不然会出现不可预料的后果。

 Z-Order 问题 AWT 组件总是显示在 Swing 组件之上。

当使用包含 AWT 组件的 POP-UP 菜单的时候要小心,尽量不要这样使用。

 

6.6调试 

调试在软件开发中是一个很重要的局部,存在软件生命周期的各个局部中。

调试能够用配置开、关是最根本的。

 很常用的一种调试方法就是用一个 PrintStream 类成员,在没有定义调试流的时候就为 null,类要定义一个 debug 方法来设置调试用的流。

 

6.7性能 

在写代码的时候,从头至尾都应该考虑性能问题。

这不是说时间都应该浪费在优化代码上,而是我们时刻应该提醒自己要注意代码的效率。

比如:

如果没有时间来实现一个高效的算法,那么我们应该在文档中记录下来,以便在以后有空的时候再来实现她。

 不是所有的人都同意在写代码的时候应该优化性能这个观点的,他们认为性能优化的问题应该在项目的后期再去考虑,也就是在程序的轮廓已经实现了以后。

 不必要的对象构造 不要在循环中构造和释放对象 

6.8使用 StringBuffer 和StringBuilder对象 

在处理 String 的时候要尽量使用 StringBuffer 类,StringBuffer 类是构成 String 类的根底。

String 类将 StringBuffer 类封装了起来,〔以花费更多时间为代价〕为开发人员提供了一个安全的接口。

当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大局部的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象。

比如:

如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用 StringBuffer 对象和她的 append() 方法。

如果我们用 String 对象代替 StringBuffer 对象的话,会花费许多不必要

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2