更新時間:2023年08月15日09時54分 來源:傳智教育 瀏覽次數(shù):
在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方法中返回新的副本,以保持不可變性。