効果javaアイテム6整理


Stringインスタンス


次のコードは、実行するたびに新しいStringインスタンスを作成します.
	String rice = new String("kimchi");
次のコードは、新しいインスタンスを作成しますが、Stringインスタンスを使用します.
このメソッドはString Constant Pool領域に文字列テキストとして格納されます.
	String rice = "kimchi";

String.maches()のパフォーマンスホットスポット


次のコードはStringです.これは行軍の内部コードです.
コードでは、一致を使用するたびにPatternインスタンスが使用され、破棄されます.
こうして捨てられると、パンツシリーズの対象になります.
	//  ...의 내용을 토대로 Pattern 인스턴스가 생성된다.
	"".matches(...);
    
    public boolean matches(String regex) {
        return Pattern.matches(regex, this);
    }
    
    public static boolean matches(String regex, CharSequence input) {
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(input);
        return m.matches();
    }
    
    public static Pattern compile(String regex) {
        return new Pattern(regex, 0);
    }
次のコードは、(不変の)Patternインスタンスを静的に初期化します.
後で必要に応じて、インスタンスをいつでも呼び出すことができます.
	private static final TEST_PATTERN = Pattern.compile(...);
    
    TEST_PATTERN.matcher("...").matches();
不要なインスタンスが発生する可能性があるので、内部の動作を見てみましょう.

遅延初期化(lazy initiation)


これは、フィールドの初期化時間を最初に値が必要になったときに遅らせる方法です.
synchronizedを使用してスレッドを安全に初期化する方法.
静的フィールドの遅延初期化holderクラスの慣用球初期化技術.
二重検査寛容球技術を用いて、インスタンスフィールド遅延初期化を行った.

アダプタ(AdaptorまたはView)


自動梱包


以下のコードに示すように,基本タイプとRapperタイプを混在させて使用すると自動運転が発生する.
メソッドのsum変数のタイプはlongであるため、sum+=iを実行するたびにlongインスタンスが作成されます.
	private static long sum() {
    	Long sum = 0L;
        
        for(long i = 0; i < ...; i++0) {
        	sum += i;
        }
        
        return sum;
	}

防御レプリケーション(防御レプリケーション)


防御的レプリケーションの方法での使用
別のスレッドでリスト・オブジェクトの値を変更すると、問題が発生します.
したがって、パラメータとして渡す場合は、新しいオブジェクトを作成して渡す必要があります.

重いオブジェクトでない場合は、作成したほうがいいです。


JVMのゴミ収集器は最適化されており、データベース接続プールのような重いものでなければ作成したほうがいいです.
レプリケーションに失敗した場合に発生する問題は、オブジェクトの重複作成時に発生する損失よりもはるかに大きいです.