江苏亿科达科技发展有限公司
4.4 字段
4.4.1 常量
采用完整的英文大写单词,在词与词之间用下划线连接,如:DEFAULT_VALUE
4.4.2 变量和参数
对不易清楚识别出该变量类型的变量应使用类型缩写作其前缀,如字符串使用strXXX,boolean 使用isXXX,hasXXX 等等。除第一各个单词外其余单词首字母大写。对私有实例变量可使用下划线“_”前缀,但在其存取方法中则应该将其前缀去掉。局部变量及输入参数不要与类成员变量同名(get/set 方法与构造函数除外)。
4.4.3 组件/部件
应采用完整的英文描述符命名组件(接口部件),遵循匈牙利命名法则页面部件名建议命名为:btnOK、lblName 或okBtn、nameLbl。(II)
4.4.4 集合
一个集合,例如数组和矢量,应采用复数命名来表示队列中存放的对象类型。命名应采用完整的英文描述符,名字中所有非开头的单词的第一个字母应大写,适当使用集合缩写前缀。如:__
11/18
江苏亿科达科技发展有限公司
5 编程规范(Programming Conventions)
声明的基本原则是遵守Java 语言规范,并遵从习惯用法。。
5.1 基本规范
? ? ? ?
当面对不可知的调用者时,方法需要对输入参数进行校验,如不符合抛出IllegalArgumentException,建议使用Spring 的Assert 系列函数。
隐藏工具类的构造器,确保只有static 方法和变量的类不能被构造实例。 变量,参数和返回值定义尽量基于接口而不是具体实现类。如:
代码中不能使用System.out.println(),e.printStackTrace(),必须使用logger 打印信息。
5.2 类与接口
5.2.1 基本原则 ?
类的划分粒度,不可太大,造成过于庞大的单个类,也不可太细,从而使类的继承太深。一般而言,一个类只做一件事;另一个原则是根据每个类的职责进行划分,比如用User 来存放用户信息,而用UserDAO 来对用户信息进行数据访问操作(比如存取数据库),? ? ? ?
用UserBroker 来封装用户信息的业务操作等等。 多使用设计模式,随时重构。
多个类中使用相同方法时将其方法提到一个接口中或使用抽象类,尽量提高重用度。 将不希望再被继承的类声明成final,例如某些实用类,但不要滥用final,否则会对系统的可扩展性造成影响。
将不希望被实例化的类的缺省构造方法声明成private。
5.2.2 抽象类与接口
一般而言:接口定义行为,而抽象类定义属性和公有行为,注意两者间的取舍,在设计中,可由接口定义公用的行为,由一个抽象类来实现其部分或全部方法,以给子类提供统一的行为定义,可参考Java 集合等实现。
多使用接口,尽量做到面向接口的设计,以提高系统的可扩展性。
5.2.3 继承与组合
尽量使用组合来代替继承,一则可以使类的层次不至于过深,而且会使类与类,包与包之间的耦合度更小,更具可扩展性。
5.2.4 构造函数和静态工厂方法
当需要使用多个构造函数创建类时,建议使用静态工厂方法替代这些构造方法。
12/18
江苏亿科达科技发展有限公司
5.3 方法
5.3.1 基本原则
? 一个方法只完成一项功能,在定义系统的公用接口方法外的方法应尽可能的缩 小其可见性。
? 避免用一个类是实例去访问其静态变量和方法。 ? 避免在一个较长的方法里提供多个出口。
5.3.2 参数和返回值
? 避免过多的参数列表,尽量控制在5 个以内,若需要传递多个参数时,当使 用一个容纳这些参数的对象进行传递,以提高程序的可读性和可扩展性。
? 参数类型和返回值尽量接口化,以屏蔽具体的实现细节,提高系统的可扩展性。
5.4 错误与异常
5.4.1 基本原则
? 通常的思想是只对错误采用异常处理:逻辑和编程错误,设置错误,被破坏的 数据,资源耗尽,等等。
? 通常的法则是系统在正常状态下以及无重载和硬件失效状态下,不应产生任何 异常。
? 最小化从一个给定的抽象类中导出的异常的个数。 ? 对于经常发生的可预计事件不要采用异常。 ? 不要使用异常实现控制结构。
? 确保状态码有一个正确值。
? 在本地进行安全性检查,而不是让用户去做。
? 若有finally 子句,则不要在try 块中直接返回,亦不要在finally 中直接返 回。
5.4.2 已检查异常与运行时异常
? 已检查异常必须捕捉并做相应处理,不能将已检查异常抛到系统之外去处理。 ? 对可预见的运行时异常当进行捕捉并处理,比如空指针等。通常,对空指针的 判断不是使用捕捉NullPointException 的方式,而是在调用该对象之前使用判 断语句进行直接判断。
? 建议使用运行时异常(RuntimeException)代替已检查异常(CheckedException)。
5.4.3 异常处理
? 重新抛出的异常必须保留原来的异常,即throw new NewException(\
13/18
江苏亿科达科技发展有限公司
e); 而不能写成throw new NewException(\。
? 在所有异常被捕获且没有重新抛出的地方必须写日志,避免异常的湮没。 ? 如果属于正常异常的空异常处理块必须注释说明原因,否则不允许空的catch 块。
? 框架尽量捕获低级异常,并封装成高级异常重新抛出,隐藏低级异常的细节。
? 多个异常应分别捕捉并处理,避免使用一个单一的catch 来处理。
5.5 JDK5.0 及后续版本
? 重载方法必须使用@Override,可避免父类方法改变时导致重载函数失效 ? 不关心的warning 信息用@SuppressWarnings(\,
@SuppressWarnings(\注释掉。
5.6 性能与安全
5.6.1 String 与StringBugffer
不要使用如下String 初始化方法: String str = new String(“abcdef”);
这将产生两个对象,应当直接赋值:
String str = “abcdef”;
在处理可变String 的时候要尽量使用StringBuffer 类,StringBuffer 类是构成String 类的基础。String 类将StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用StringBuffer 来实现大部分的工作,当工作完成后将StringBuffer 对象再转换为需要的String 对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用StringBuffer 对象和她的append() 方法。如果我们用String 对象代替StringBuffer 对象的话,将会花费许多不必要的创建和释放对象的CPU 时间。
5.6.2 集合
避免使用Vector 和HashTable 等旧的集合实现,这些实现的存在仅是为了与旧的系统兼容,而且由于这些实现是同步的,故而在大量操作时会带来不必要的性能损失。在新的系统设计中不当出现这些实现,使用ArrayList 代替Vector,使用HashMap 代替HashTable。 若却是需要使用同步集合类,当使用如下方式获得同步集合实例:
Map map = Collections.synchronizedMap(new HashMap());
由于数组、ArrayList 与Vector 之间的性能差异巨大(具体参见《Java fitball》),故在能使用数组时不要使用ArrayList,尽量避免使用Vector。
5.6.3 对象
14/18
江苏亿科达科技发展有限公司
? 避免在循环中频繁构建和释放对象。 ? 不再使用的对象应及时销毁。 ? 如无必要,不要序列化对象
5.6.4 同步
? 在不需要同步操作时避免使用同步操作类,如能使用ArrayList 时不要使用 Vector。
? 尽量少用同步方法,避免使用太多的synchronized 关键字。
? 尽量将同步最小化,即将同步作用到最需要的地方,避免大块的同步块或方法 等。
5.6.5 final
? 将参数或方法声明成final 可提高程序响应效率,故此:
? 注意绝对不要仅因为性能而将类、方法等声明成final,声明成final 的类、方法一定要? ? ? ?
确信不再被继承或重载!
不需要重新赋值的变量(包括类变量、实例变量、局部变量)声明成final。 所有方法参数声明成final。
私有(private)方法不需要声明成final。 若方法确定不会被继承,则声明成final。
5.6.6 垃圾收集和资源释放
不要过分依赖JVM 的垃圾收集机制,因为你无法预测和知道JVM 在什么时候运行GC。尽可能早的释放资源,不再使用的资源请立即释放。
可能有异常的操作时必须在try 的finally 块中释放资源,如数据库连接、IO 操 作等。
15/18