第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么共享不可變對(duì)象的可變內(nèi)部是個(gè)好主意?

為什么共享不可變對(duì)象的可變內(nèi)部是個(gè)好主意?

蝴蝶不菲 2022-06-15 14:38:03
我正在閱讀 Joshua Bloch 的“Effective Java”并有兩個(gè)問(wèn)題。布洛赫陳述如下。您不僅可以共享不可變對(duì)象,還可以共享它們的內(nèi)部。然后他繼續(xù)舉一個(gè)例子,其中一個(gè)實(shí)例BigInteger與另一個(gè)實(shí)例共享其幅度數(shù)組BigInteger。我的第一個(gè)問(wèn)題是:這是否違反了布洛赫之前提出的規(guī)則,即確保對(duì)可變組件的獨(dú)占訪問(wèn)。作為共享可變內(nèi)部可能存在問(wèn)題的一個(gè)示例,在我看來(lái),如果同一個(gè)類的兩個(gè)實(shí)例sample1可以sample2共享它們的內(nèi)部,那么您可以擁有以下內(nèi)容。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通過(guò)構(gòu)造函數(shù)共享其內(nèi)部public Sample(int[] field1, Sample sampleForField2)。這會(huì)導(dǎo)致混疊,導(dǎo)致sample1'field2值為{11, 12}。因此,我的第二個(gè)問(wèn)題是:在實(shí)例之間共享可變內(nèi)部不會(huì)破壞不變性嗎?
查看完整描述

1 回答

?
慕姐8265434

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊

只要您以不可變的方式公開(kāi)對(duì)象的內(nèi)部,就可以共享不可變對(duì)象的內(nèi)部。


例如:


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);

  }

}

數(shù)組是一個(gè)低效的例子,但它仍然是可能的。更高效的事情是將內(nèi)部狀態(tài)存儲(chǔ)/公開(kāi)為某種形式,Collection<String>以便您可以將內(nèi)部設(shè)置為不可修改的對(duì)象:


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));

  }


}


查看完整回答
反對(duì) 回復(fù) 2022-06-15
  • 1 回答
  • 0 關(guān)注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)