本文介绍的JAVA规则的说明分为个级别级别是最基本也是最重要的级别在今后将陆续写出其他的规则遵守了这些规则可以提高程序的效率使代码有更好的可读性等
() 避免使用NEW关键字来创建String对象
把一个String常量copy到String 对象中通常是多余浪费时间的
Public class test{
Public void method(){
Systemoutprint (str);
}
private String str = new String (); //这里新建对象是完全没有必要的
private String str= //正确的应该如此
}
参考Joshua Bloch: Effective Java Programming Language Guide
() 避免使用不必要的嵌套
过多的嵌套会使你的代码复杂化减弱可读性
Public class test {
String add (){
Int c=(a=a+b)+b; //过于复杂
Return c
}
}
参考#
() 避免在同一行声明不同类型的多个变量
这样可以使程序更加清晰避免混乱
private int index index[];
正确的应该如此
private int index;
private int index[];
参考#
() 在每一行里写一条语句
这条规则不包括for语句比如for (int i = ; i < ; i++) x;可以增加代码的可读性
public class OSPL {
int method (int a int b) {
int i = a + b; return i; // 可读性不强
}
正确的
public class OSPLFixed {
int method (int a int b) {
int i = a + b;
return i;
}
}
参考Section of #
()经常从finalize ()中调用superfinalize ()
这里的finalize ()是java在进行垃圾收集的时候调用的和finally不一样如果你的父类没有定义finally()的话你也应该调用这里有两个原因()在不改变代码的情况下能够将父类的finally方法加到你的类中 ()以后你会养成习惯调用父类的finally方法即使父类没有定义finally方法的时候
正确的方法应该如此
public class parentFinalize {
protected void finalize () throws Throwable {
superfinalize(); // FIXED
}
参考The Java Programming Language by Ken Arnold and James Gosling page
() 不要在finalize ()中注销listeners
不要再finalize ()方法中中注销listenersfinalize ()只有再没有对象引用的时候调用如果listeners从finalize()方法中去除了被finalize的对象将不会在垃圾收集中去除
public void finalize () throws Throwable {
bButtonremoveActionListener (act);
}
() 不要显式的调用finalize ()方法
虽然显式的调用这个方法可以使你确保你的调用但是当这个方法收集了以后垃圾收集会再收集一次
public class T {
public void finalize() throws Throwable {
close_resources ();
superfinalize ();}
public void close_resources()
{}
}
class Test {
void cleanup () throws Throwable {
tfinalize();// 调用
t = null;}
private t = new T ();
}
对于这样的调用我们应该自己创建一个释放的方法做最初finalize ()所作的事情当你每次想显式的调用finalize ()的时候实际上调用了释放方法然后再使用一个判断字段来确保这个方法只执行一次以后再调用就没关系了
public class T {
public synchronized void release () throws Throwable{
if (!_released) {
close_resources ();
// do what the old finalize () did
_released = true;
}
}
public void finalize ()
throws Throwable {
release ();
superfinalize ();
}
public void close_resources()
{}
private boolean _released = false;}class TestFixed {
void closeTest () throws Throwable {
t release ();// FIXED
t= null;
}
private T t= new T ();}
参考Nigel Warren Philip Bishop: Java in Practice Design Styles and Idioms
for Effective Java AddisonWesley pp
()不要使用不推荐的API
尽量使用JDK推荐的API在类和方法或者java组件里有很多方法是陈旧的或者是可以选择的有一些方法SUN用了deprecated标记最好不要使用例如
private List t_list = new List ();
t_listaddItem (str);
如果查一下javadoc的话会发现建议用add()来代替addItem()
参考
()为所有序列化的类创建一个serialVersionUID
可以避免从你各种不同的类破坏序列的兼容性如果你不特别制订一个UID的话那么系统为自动产生一个UID(根据类的内容)如果UID在你新版本的类中改变了即使那个被序列化的类没改变你也不能反序列化老的版本了
public class DUID implements javaioSerializable {public void method () {}}
在里面加一个UID当这个类的序列化形式改变的时候你也改变这个UID就可以了
public class DUIDFixed implements javaioSerializable {
public void method ()
{}
private static final long serialVersionUID = ; }
参考Joshua Bloch: Effective Java Programming Language Guide
Addison Wesley pp
()对于private常量的定义
比较好的做法是对于这样的常量加上final标记这样的常量从初始化到最后结束值都不会改变
private int size = ;
改变后的做法是
private final int size = ;
()避免把方法本地变量和参数定义成和类变量相同的名字
这样容易引起混扰建议把任何的变量字都定义成唯一的这样看来SCJP里的那些题目在现实中就用不到了)
public void method (int j) {final int i = ;// VIOLATION} private int j = ;
建议
public void method (int j) {final int i = ;// VIOLATION} private int j = ;