読者です 読者をやめる 読者になる 読者になる

Javaによるオブジェクトの生成について

Java

文字列の初期化

String s = new String("stringette"); // これをやってはいけない
String s = "stringette"; // これが正しい

実行される時に新たなインスタンスを作成せず、同じ文字列リテラルを持つ他のコードが、そのオブジェクトを再利用することが保証されている。

不変オブジェクトの初期化

不変オブジェクトに関しては、staticファクトリーメソッドによりオブジェクトの生成を回避できる。また、不変オブジェクトの内部に導出項目がある場合、static初期化ブロックで導出項目を初期化することで、導出項目へのアクセスの度に発生するオブジェクト生成を抑えられる。

アダプター

アダプターは、内部で保持しているオブジェクトに対する代替のインターフェースを提供しながら、その内部で保持しているオブジェクトへの委譲を行っているオブジェクトで、ビューとも呼ばれる。
Map インターフェースの keySet がその例で、keySet は Map の保持するデータに対するビューを提供しているのみで、このアダプターは、内部で保持しているオブジェクトの状態以外の状態を持っていないので、ある特定のオブジェクトに対するアダプターのインスタンスを2つ以上生成する必要がない。

自動ボクシングの注意点

以下は sum が Long オブジェクトとして定義されているので、long i を Long sum に加算する毎に1つのインスタンスが生成され、パフォーマンスはかなり悪い例

public static void main(String[] args) {
    Long sum = 0L;
    for (long i = 0; i < Integer.MAX_VALUE; i++) {
        sum += 1;
    }
}

ボクシングされた基本データ型よりも基本データ型を選び、意図しない自動ボクシングに注意する必要がある

まとめ

最新の JVM 実装では、オブジェクトの生成には大きなコストがかからないので、プログラムの明瞭性、簡素性、能力を改善するために付加的なオブジェクトを生成するのは一般的には良いことである。
オブジェクトプールなどは、オブジェクトの生成がかなり重いものと判断された場合のみ使うようにするべき。