亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么共享不可變對象的可變內部是個好主意?

為什么共享不可變對象的可變內部是個好主意?

蝴蝶不菲 2022-06-15 14:38:03
我正在閱讀 Joshua Bloch 的“Effective Java”并有兩個問題。布洛赫陳述如下。您不僅可以共享不可變對象,還可以共享它們的內部。然后他繼續舉一個例子,其中一個實例BigInteger與另一個實例共享其幅度數組BigInteger。我的第一個問題是:這是否違反了布洛赫之前提出的規則,即確保對可變組件的獨占訪問。作為共享可變內部可能存在問題的一個示例,在我看來,如果同一個類的兩個實例sample1可以sample2共享它們的內部,那么您可以擁有以下內容。public final class Sample {    private final int[] field1;    private final int[] field2;    public Sample(int[] field1, int[] field2) {        this.field1 = field2;        this.field2 = field2;    }    public Sample(int[] field1, Sample sampleForField2) {        this.field1 = field1;        for (int i = 0; i < sampleForField2.field2.length; i++) {            sampleForField2.field2[i] += 1;        }        this.field2 = sampleForField2.field2;    }    public static void main(String[] args) {        Sample sample1 = new Sample(new int[]{0, 1}, new int[]{10, 11});        Sample sample2 = new Sample(new int[]{20, 21}, sample1);        System.out.println(Arrays.toString(sample1.field2));    }}在上面的示例中,a能夠b通過構造函數共享其內部public Sample(int[] field1, Sample sampleForField2)。這會導致混疊,導致sample1'field2值為{11, 12}。因此,我的第二個問題是:在實例之間共享可變內部不會破壞不變性嗎?
查看完整描述

1 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

只要您以不可變的方式公開對象的內部,就可以共享不可變對象的內部。


例如:


public class ImmutableObj {


  private final String[] internals;


  public ImmutableObj(String[] strings) {

    internals = Arrays.copyOf(strings, strings.length);

  }


  public String[] getInternals() {

    // return a copy of the internal state, since arrays

    // do not offer an immutable view

    return Arrays.copyOf(internals, internals.length);

  }

}

數組是一個低效的例子,但它仍然是可能的。更高效的事情是將內部狀態存儲/公開為某種形式,Collection<String>以便您可以將內部設置為不可修改的對象:


public class ImmutableObj {


  // Simply make this public instead of getter since it is read-only

  public final List<String> internals;


  public ImmutableObj(String[] strings) {

    internals = Collections.unmodifiableList(Arrays.asList(strings));

  }


}


查看完整回答
反對 回復 2022-06-15
  • 1 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號