教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

我們能創(chuàng)建一個(gè)包含可變對(duì)象的不可變對(duì)象嗎?

更新時(shí)間:2023年08月15日09時(shí)54分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  在Java中,創(chuàng)建一個(gè)包含可變對(duì)象的不可變對(duì)象是一項(xiàng)相對(duì)復(fù)雜的任務(wù),因?yàn)椴豢勺儗?duì)象的核心特性是其狀態(tài)在創(chuàng)建后不能被修改。但是,如果我們需要在不可變對(duì)象內(nèi)部包含可變對(duì)象,可以采用一些策略來實(shí)現(xiàn)這一目標(biāo)。

  讓我們以一個(gè)具體的例子來說明:假設(shè)我們要?jiǎng)?chuàng)建一個(gè)不可變的Person類,其中包含一個(gè)可變的Address對(duì)象,來展示如何處理這種情況。

  首先,讓我們定義可變的Address類:

public class Address {
    private String city;
    private String street;

    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public String getStreet() {
        return street;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public void setStreet(String street) {
        this.street = street;
    }
}

  然后,我們可以嘗試創(chuàng)建一個(gè)不可變的Person類,其中包含一個(gè)Address對(duì)象作為其字段:

public final class Person {
    private final String name;
    private final Address address;

    public Person(String name, Address address) {
        this.name = name;
        // 這里我們需要?jiǎng)?chuàng)建一個(gè)新的Address對(duì)象,以避免外部修改影響不可變性
        this.address = new Address(address.getCity(), address.getStreet());
    }

    public String getName() {
        return name;
    }

    public Address getAddress() {
        // 返回一個(gè)新的Address對(duì)象,防止外部修改影響不可變性
        return new Address(address.getCity(), address.getStreet());
    }
}

  在上面的示例中,Person類包含一個(gè)私有的可變Address字段,但是在構(gòu)造函數(shù)和getter方法中,我們都會(huì)返回一個(gè)新的Address對(duì)象,以確保外部無法修改原始的Address對(duì)象。這樣一來,盡管Person類內(nèi)部包含可變的Address對(duì)象,但由于外部無法修改這些可變對(duì)象,從外部來看,Person類仍然表現(xiàn)為不可變對(duì)象。

  需要注意的是,雖然這種方法可以實(shí)現(xiàn)包含可變對(duì)象的不可變對(duì)象,但它可能會(huì)導(dǎo)致一些性能開銷,因?yàn)樵诿看潍@取Address對(duì)象時(shí)都需要?jiǎng)?chuàng)建一個(gè)新的對(duì)象。在實(shí)際應(yīng)用中,需要權(quán)衡不可變性和性能之間的取舍。

  總之,要在Java中創(chuàng)建包含可變對(duì)象的不可變對(duì)象,關(guān)鍵是確保外部無法修改可變字段,并在getter方法中返回新的副本,以保持不可變性。

0 分享到:
和我們?cè)诰€交談!