『Effective Java』読書ノート(六)不要なオブジェクトの作成を避ける

2531 ワード

JAvaには修飾クラスの属性のキーワードがたくさんあります:よく使われるstatic,final
finalとstaticについて話しましょう.普段プログラミングをしているとき、この2つのキーワードはあってもなくてもいいと思っていることが多いです.一番多いのは彼ら2人が同時に現れたときです.定数を定義するとき、他のとき:1.プログラムの正常な運行に何の影響もないと感じた.この2つのキーワードを使わなくても問題ないように見えます.
これがプログラマーとエンジニアの違いでしょう.この一歩を踏み出して、逸品コードを書きます.
1.クラスのプロパティを定義するときは、このプロパティが可変なのか、すべてのオブジェクトが共通しているのかを真剣に考慮します.すべてのオブジェクトに共通するプロパティをstaticキーワードに追加します.
次に例を示します.
文字列が有効なローマ数字であるかどうかを判断します.
static boolean isRomanNumeral(String s) {
    return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
            + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}

プログラムは簡潔に見えますが、このメソッドを呼び出すたびに新しいPatternインスタンスが作成され、一度だけ使用されます.
次のバージョンに変更します.
public class RomanNumerals {
    private Pattern roman= Pattern.compile(
            "^(?=.)M*(C[MD]|D?C{0,3})"
            + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");

    static boolean isRomanNumeral(String s) {
        return roman.matcher(s).matches();
    }
}

Effective Javaでは、著者のパソコンでは最初のシナリオで8文字の文字列を入力するには1.1微妙だったが、roman属性にstatic finalフィールドを加えると、8文字の字を入力するには0.17マイクロ秒かかり、速度は6.5倍に向上したと述べている.
2.梱包の基本タイプではなく、基本タイプを優先的に使用します.梱包の基本タイプはオブジェクトで、使用するたびに新しいオブジェクトが作成される場合があります.
要するに、プログラムが既存のオブジェクトを再利用できる場合、新しいオブジェクトを作成しないでください.しかし、新しいオブジェクトを作成しないことを過度に追求してはいけません.オブジェクトを作成したり、独り占めしたりするゴミ回収は非常に安価です.逆に、自分で自分のオブジェクトプールを維持すると、プログラムが非常に面倒になります.
度を考慮してください:Effective Javaでは、既存のオブジェクトを再利用する必要がある場合は、オブジェクトを作成しないでください.新しいオブジェクトを作成する必要がある場合は、既存のオブジェクトを繰り返し使用しないでください.