Num1:檢查引數的有效性
絕大多數的方法和構造器對於傳遞給它們的引數值都會有某些限制。比如:索引值必須是非負數,物件引用不能為null
等等。這些都很常見,你應該在文件中清楚地指明所有這些限制,並在方法體的開頭處檢查引數,以強制施加這些限制。
示例程式碼:
public BigInteger mod(BigInteger m){
if(m.signum()<=0){
throw new ArithmeticException("Modulus <= 0"+m);
}
}
Num2:慎用過載
看個問題程式碼:
public class CollectionClassifier {
public static String classify(Set<?> s) {
return "Set";
}
public static String classify(List<?> lst) {
return "List";
}
public static String classify(Collection<?> c) {
return "Unknown Collection";
}
public static void main(String[] args) {
Collection<?>[] collections = { new HashSet<String>(),
new ArrayList<BigInteger>(),
new HashMap<String, String>().values() };
for (Collection<?> c : collections)
System.out.println(classify(c));
}
}
這個程式碼最終的三個結果是:“Unknown Collection”,為何會這樣的呢,是方法被過載了,而要呼叫哪個過載方法是在編譯時做出決定的。
可以因覆蓋來代替試試。
class Wine {
String name() {
return "wine";
}
}
class SparklingWine extends Wine {
@Override
String name() {
return "sparkling wine";
}
}
class Champagne extends SparklingWine {
@Override
String name() {
return "champagne";
}
}
public class Overriding {
public static void main(String[] args) {
Wine[] wines = { new Wine(), new SparklingWine(), new Champagne() };
for (Wine wine : wines)
System.out.println(wine.name());
}
}
輸出的結果是:wine,sparkling wine,champagne
Num3:慎用可變引數
示例程式碼
public class Varargs {
// Simple use of varargs - Page 197
static int sum(int... args) {
int sum = 0;
for (int arg : args)
sum += arg;
return sum;
}
// The WRONG way to use varargs to pass one or more arguments! - Page 197
// static int min(int... args) {
// if (args.length == 0)
// throw new IllegalArgumentException("Too few arguments");
// int min = args[0];
// for (int i = 1; i < args.length; i++)
// if (args[i] < min)
// min = args[i];
// return min;
// }
// The right way to use varargs to pass one or more arguments - Page 198
static int min(int firstArg, int... remainingArgs) {
int min = firstArg;
for (int arg : remainingArgs)
if (arg < min)
min = arg;
return min;
}
public static void main(String[] args) {
System.out.println(sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
System.out.println(min(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
}
}
Num4:返回零長度的陣列或者集合,而不是Null
有時候有人會認為:null
返回值比零長度陣列更好,因為它避免了分配陣列所需要的開銷。這種觀點是站不住腳的。
原因如下:
1,在這個級別上擔心效能問題是不明智的。
2,對於不返回任何元素的呼叫,每次都返回同一個零長度陣列是有可能的,因為零長度陣列是不可變的,而不可變物件有可能被自由地共享。
簡而言之,返回型別為陣列或集合的方法沒理由返回null
,而不是返回一個零長度的陣列或集合。