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

全國咨詢/投訴熱線:400-618-4000

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

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

好口碑IT培訓

  在Java中,創(chuàng)建一個包含可變對象的不可變對象是一項相對復雜的任務,因為不可變對象的核心特性是其狀態(tài)在創(chuàng)建后不能被修改。但是,如果我們需要在不可變對象內部包含可變對象,可以采用一些策略來實現(xiàn)這一目標。

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

  首先,讓我們定義可變的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)建一個不可變的Person類,其中包含一個Address對象作為其字段:

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

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

    public String getName() {
        return name;
    }

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

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

  需要注意的是,雖然這種方法可以實現(xiàn)包含可變對象的不可變對象,但它可能會導致一些性能開銷,因為在每次獲取Address對象時都需要創(chuàng)建一個新的對象。在實際應用中,需要權衡不可變性和性能之間的取舍。

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

0 分享到:
和我們在線交談!