9

私はEffective Javaを読んでいて、不変オブジェクトを共有できるだけでなく、それらの内部も共有できるという声明に出くわしました。しかし、私はそれが実際に何を意味するのかを理解するのに苦労しています.本には例がありません. などの不変オブジェクトを変更できないことは既に知っていますString

4

4 に答える 4

6

たとえば、クラスがある場合

public class Vector2d { 
  private final BigDecimal a;
  private final BigDecimal b;
}

aとはそのbクラスの「内部」です。これはインスタンスであるBigDecimalため、不変です。のような操作を実装するsetBToZero()と、インスタンスを再利用するだけでa、新しいインスタンスを再作成する必要がなくなります。例えば

public Vector2d setBToZero() { 
  return new Vector2d(a, 0);
}

内部を共有します。aこれは不変であるため、共有状態の変更について心配する必要はありません。これは、大きなオブジェクトに関しては特に便利です。インターフェイスを使用する場合、プロキシ オブジェクトを使用しないと一部の操作を実装できません。

于 2013-06-27T07:34:40.620 に答える
0

不変オブジェクトの内部を共有する例。データは不変であり、そのバイト配列を Data の他の不変インスタンスと共有します。

public final class Data {

    private byte[] data; 
    private int start;
    private int end;

    private Data(byte[] data, int start, int end) {
        this.data = data;
        this.start = start;
        this.end = end;
    }

    public Data(byte[] data) {
        this(Arrays.copyOf(data), 0, data.length - 1); // copy so nobody can access our array
    }

    public Data lowerHalf() {
        return new Data(this.data, 0, data.length / 2);  // sharing byte array
    }

    public byte get(int index) {
        return data[start + index];
    }         
}        
于 2013-06-27T07:35:33.367 に答える