【Java基礎】方法

cryAllen發表於2016-06-28

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,而不是返回一個零長度的陣列或集合。

相關文章