Java开发编码规范
第一章 代码开发规范及其指南
一.1 目的
定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)
一.2 程序内命名规范
l Package 的命名 :Package 的名字应该都是由一个小写单词组成。
l Class 的命名 :Class 的名字必须由大写字母开头而其他字母都小写的单词组成
l Class 变量的命名 :变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。
l Static Final 变量的命名 :Static Final 变量的名字应该都大写,并且指出完整含义。
l 参数的命名 :参数的名字必须和变量的命名规范一致。
l 数组的命名 :数组应该总是用下面的方式来命名: byte[] buffer; 而不是 byte buffer[];
l 方法的参数 :使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
SetCounter(int size){
this.size = size;
}
一.3 文件命名规范
l 文件名由英文单词组成,每个单词的首字母大写,不要超过4个单词,如ShipOrder.jsp。
l Java文件的文件名要与程序中的public类名相同。
l Servet文件要以Servlet做为结尾,如AddCompanyServlet.java
l 业务处理组件JavaBean要以Bean为结尾,如ProcessBean.java
一.4 Java 文件样式
所有的 Java(*.java) 文件都必须遵守如下的样式规则
l 头部
版权信息
版权信息必须在 java 文件的开头,比如:
/** * Copyright 2002 Sun Microsystems, Inc. All rights reserved. */ |
其他不需要出现在 javadoc 的信息也可以包含在这里。
l Package/Imports
package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。
package hotlava.net.stats; import java.io.*; import java.util.Observable; import hotlava.util.Application; |
这里 java.io.* 使用来代替InputStream and OutputStream 的。
l Class
接下来的是类的注释,一般是用来解释类的相关信息,包括标题、描述、。
/** * <p>Title: Example</p> * <p>Description: AuditApplicationExample</p> * <p>Copyright: Copyright (c) 200x</p> * <p>Company: xxxxx</p> * @author xxxxxx * @version 1.0 */ |
接下来是类定义,包含了在不同的行的 extends 和 implements
public class CounterSet extends Observable implements Cloneable |
l Class Fields
接下来是类的成员变量:
/** * Packet counters */ protected int[] packets; |
public 的成员变量必须生成文档(JavaDoc)。protected、private和 package 定义的成员变量如果名字含义明确的话,可以没有注释。
l 存取方法
接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。
/** * 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; } |
其它的方法不要写在一行上
l 构造函数
接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。 访问类型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 应该在一行中。
Public CounterSet (int size){ this.size = size; } |
l 克隆方法
如果这个类是可以被克隆的,那么下一步就是 clone 方法:
public Object 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()); } } |
l 类方法
下面开始写类的方法:
/** * Set the packet counters * (such as when restoring from a database) */ protected final void setArray(int[] r1, int[] r2, int[] r3, int[] r4) throws IllegalArgumentException { // // Ensure the arrays are of equal size // if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length) throw new IllegalArgumentException("Arrays must be of the same size"); System.arraycopy(r1, 0, r3, 0, r1.length); System.arraycopy(r2, 0, r4, 0, r1.length); } |
l toString 方法
无论如何,每一个类都应该定义 toString 方法:
public String toString() { String retval = "CounterSet: "; for (int i = 0; i < data.length(); i++) { retval += data.bytes.toString(); retval += data.packets.toString(); } return retval; } } |
l main 方法
如果main(String[]) 方法已经定义了, 那么它应该写在类的底部.
一.5 代码编写格式
l 代码样式
代码应该用 unix 的格式,而不是 windows 的(比如:回车变成回车+换行)
l 文档化
必须用 javadoc 来为类生成文档。不仅因为它是标准,这也是被各种 java 编译器都认可的方法。
l 缩进
缩进应该是每行4个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度.
如果你使用 UltraEdit 作为 Java 源代码编辑器的话,你可以通过如下操作来禁止保存Tab字符, 方法是通过 UltrEdit中先设定 Tab 使用的长度是4个空格,然后用 Format|Tabs to Spaces 菜单将 Tab 转换为空格。
l 页宽
页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符.
l 程序块
要有大括号,即使只有一句程序
{} 中的语句应该单独作为一行. 例如, 下面的第1行是错误的, 第2行是正确的:
if (i>0) { i ++ }; // 错误, { 和 } 在同一行 if (i>0) { i ++ }; // 正确, { 单独作为一行 } 语句永远单独作为一行. |
如果 } 语句应该缩进到与其相对应的 { 那一行相对齐的位置。
l 括号
左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不应该出现空格. 下面的例子说明括号和空格的错误及正确使用:
CallProc( AParameter ); // 错误
CallProc(AParameter); // 正确
不要在语句中使用无意义的括号. 括号只应该为达到某种目的而出现在源代码中。下面的例子说明错误和正确的用法:
if ((I) = 42) { // 错误 - 括号毫无意义
if (I == 42) or (J == 42) then // 正确 - 的确需要括号
l import
对于import语句,如果某一个包中引用的类不超过三个(包括三个),不允许用import xxx.*;格式。
l 变量
定义及方法的返回值不允许使用全包名,如java.lang.String,除非在不同的包中有相同名字的类,必须用全名来区分。对于类中属性的存取要用方法(getXXX/setXXX,boolean值用isXXX/setXXX),不要直接引用。
第二章 程序编写规范方法
二.1 权限修饰
Java中权限修饰符有三个:public,private,protected,另外一种是不写这三种的任何一个,称为(default).
1) 对于外部类,只能用public或(default),而且一个文件中最多只能有一个public类。但是内部类这四种都可以使用。
2) 如果对某些数据或方法只允许其所在类使用,用private修饰。
3) 如果对某些数据或方法允许本类或同包类使用,用(default),即不写任何修饰符。
4) 如果对某些数据或方法允许本类,同包类,或非同包子类使用,用protected.
如果对某些数据或方法允许任何类使用,用public修饰。
二.2 其他规范
l exit()
exit 除了在 main 中可以被调用外,其他的地方不应该调用。因为这样做不给任何代码代码机会来截获退出。一个类似后台服务的程序不应该因为某一个库模块决定了要退出就退出。
l 异常
关键操作如涉及到数据库操作和多个关键处理步骤时应当采用try,catch语句,以便于捕获异常(各类Exception)和异常处理。
l 垃圾收集
JAVA使用成熟的后台垃圾收集技术来代替引用计数。但是这样会导致一个问题:必须在使用完对象的实例以后进行清场工作。
除非输出流一出作用域就关闭,非引用计数的程序语言,比如JAVA,是不能自动完成变量的清场工作的。必须象下面一样写:
FileOutputStream fos = new FileOutputStream(projectFile); project.save(fos, "IDE Project File"); fos.close(); |
l Clone
下面是一种有用的方法:
implements Cloneable public Object 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()); } } |
l final 类
绝对不要因为性能的原因将类定义为 final 的(除非程序的框架要求)
如果一个类还没有准备好被继承,最好在类文档中注明,而不要将她定义为 final 的。这是因为没有人可以保证会不会由于什么原因需要继承她。
访问类的成员变量
大部分的类成员变量应该定义为 protected 的来防止继承类使用他们。
注意,要用"int[] packets",而不是"int packets[]",后一种永远也不要用。
public void setPackets(int[] packets) { this.packets = packets; } CounterSet(int size) { this.size = size; } |
二.3 编程指南
1、byte 数组转换到 characters
为了将 byte 数组转换到 characters,可以这么做:
"Hello world!".getBytes();
2、Utility 类
Utility 类(仅仅提供方法的类)应该被申明为抽象的来防止被继承或被初始化。
3、初始化
下面的代码是一种很好的初始化数组的方法:
objectArguments = new Object[] { arguments };
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() 方法仍然有效。由于这个原因,这个技术的缺陷最好注明在文档中,或者只在自己的包中使用。
l 性能
1、在写代码的时候,从头至尾都应该考虑性能问题,要注意代码的效率。
5、不必要的对象构造
6、不要在循环中构造和释放对象
7、使用 StringBuffer 对象
在处理 String 的时候要尽量使用 StringBuffer 类,StringBuffer 类是构成 String 类的基础。String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用 StringBuffer 对象和她的 append() 方法。如果我们用 String 对象代替 StringBuffer 对象的话,会花费许多不必要的创建和释放对象的 CPU 时间。
8、避免太多的使用 synchronized 关键字
避免不必要的使用关键字 synchronized,应该在必要的时候再使用她,这是一个避免死锁的好方法。
9、可移植性
为了保证整个系统的可移植性,尽量避免使用synchronized 关键字
10、PrintStream
PrintStream 已经被不赞成(deprecated)使用,用 PrintWrite 来代替她。
第三章 其他要求
l 在controll层或该层之后关闭数据库连接,不能在页面里关闭
l 不能用select * 的查询语句
l 数据的提取工作不在页面内完成
l 若是中文参数值,尽量用post方式,不用url方式
l 在将自己的代码提交到版本控制服务器之前一定要做好单元测试,不能提交含有单元测试就应该解决的bug的代码
l 异常处理要得当,不允许任何异常都是Exception,要尽量处理可以预料到的异常。
l 在使用了jdbc的事务时,处理结束后,一定要将事务提交
如:
Conn.commit();
如果中间出现了异常,要将事务回滚后再关闭连接。
Java开发编码规范的更多相关文章
- Java Script 编码规范【转】
Java Script 编码规范 以下文档大多来自: Google JavaScript 编码规范指南 Idiomatic 风格 参考规范 ECMAScript 5.1 注解版 EcmaScript ...
- Java语言编码规范(Java Code Conventions)
Java语言编码规范(Java Code Conventions) 名称 Java语言编码规范(Java Code Conventions) 译者 晨光(Morning) 简介 本文档讲述了Java语 ...
- Android开发编码规范(自用)
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android开发编码规范 目的及指导原则 目的 统一规范 Eclipse编辑环境 ...
- ym——Android开发编码规范(自用)
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android开发编码规范 目的及指导原则 目的 统一规范 Eclipse编辑环境下J ...
- java开发命名规范(转载)
java开发命名规范 使用前注意事项: 1. 由于Java面向对象编程的特性, 在命名时应尽量选择名词 2. 驼峰命名法(Camel-Case): 当变量名或函式名是由一个或多个单字连结在一起,而 ...
- Java语言编码规范 - Java语言编码规范(中文版)(http://doc.javanb.com/code-conventions-for-the-java-programming-language-zh/index.html)
目录 1 介绍 1.1 为什么要有编码规范 1.2 版权声明 2 文件名 2.1 文件后缀 2.2 常用文件名 3 文件组织 3.1 Java源文件 3.1.1 开头注释 3.1.2 包和引入语句 ...
- 【原】JAVA SE编码规范
/* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * ...
- 不可小觑的Web开发编码规范
http://www.csdn.net/article/2013-10-21/2817235-coding-conventions-in-web-development 摘要:编码规范是一套规章制度, ...
- 【原】Java学习笔记002 - JAVA SE编码规范
/* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * ...
随机推荐
- 查看scn headroom变化趋势的几种方法
查看scn headroom变化趋势的几种方法 scn headroom问题,本文不做解释. 本文为自己的总结,脚本来自于oracle sr技术project师. 转载请注明出处http://blog ...
- 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法
垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- Apache OFBIZ高速上手(二)--MVC框架
继续上一篇博客,本篇博客介绍OFBiz的MVC框架. 1.OFBiz特点 OFBiz最基本的特点是OFBiz提供了一整套的开发基于Java的web应用程序的组件和工具.包含实体引擎.服务引擎.消息引擎 ...
- u-boot的内存分布和全局数据结构
U-boot,除非在RAM中调试,一般情况下都是从flash中执行一段代码,然后将flash中储存的代码和数据搬移到ram中,然后跳转到ram中执行.当然这应该也是一般的bootloader的执行方式 ...
- OST
爱情的条件 http://music.163.com/#/album?id=531414 kill me heal me http://music.163.com/#/album?id=3104890
- C# Task 源代码阅读(2)
上篇已经讲到Task 的默认的TaskScheduler 为ThreadPoolTaskScheduler. 这时我们回到原来的task 的start方法,在代码最后,调用了 ScheduleAndS ...
- 辨析 singleton 和 prototype
<bean id="person1" class="com.bean.life.Person"> <property name="n ...
- Windows phone开发 页面布局之屏幕方向
(博客部分内容参考Windows phone开发文档) Windows phone的屏幕方向是利用Windows phone设备的方向传感器提供的数据实现切换的. Windows Phone支持纵向和 ...
- python 上手
1.安装模块 cmd---“pip install [模块名]” 2.爬虫常用模块 requests beautifulsoup4 3.检查已安装的模块 cmd ---"pip list&q ...
- Christopher G. Atkeson 简介
有一个事实:双足机器人的稳定性问题单靠算法是搞不定的!!! 在2015 DARPA 机器人挑战赛中,许多参赛团队的机器人使用了Atlas,他们通过安装他们自己的软件并修改来让机器人保持平衡.来自WPI ...