更新時(shí)間:2023年08月15日09時(shí)54分 來源:傳智教育 瀏覽次數(shù):
在Java中,創(chuàng)建一個(gè)包含可變對象的不可變對象是一項(xiàng)相對復(fù)雜的任務(wù),因?yàn)椴豢勺儗ο蟮暮诵奶匦允瞧錉顟B(tài)在創(chuàng)建后不能被修改。但是,如果我們需要在不可變對象內(nèi)部包含可變對象,可以采用一些策略來實(shí)現(xiàn)這一目標(biāo)。
讓我們以一個(gè)具體的例子來說明:假設(shè)我們要?jiǎng)?chuàng)建一個(gè)不可變的Person類,其中包含一個(gè)可變的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)建一個(gè)不可變的Person類,其中包含一個(gè)Address對象作為其字段:
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對象,以避免外部修改影響不可變性 this.address = new Address(address.getCity(), address.getStreet()); } public String getName() { return name; } public Address getAddress() { // 返回一個(gè)新的Address對象,防止外部修改影響不可變性 return new Address(address.getCity(), address.getStreet()); } }
在上面的示例中,Person類包含一個(gè)私有的可變Address字段,但是在構(gòu)造函數(shù)和getter方法中,我們都會返回一個(gè)新的Address對象,以確保外部無法修改原始的Address對象。這樣一來,盡管Person類內(nèi)部包含可變的Address對象,但由于外部無法修改這些可變對象,從外部來看,Person類仍然表現(xiàn)為不可變對象。
需要注意的是,雖然這種方法可以實(shí)現(xiàn)包含可變對象的不可變對象,但它可能會導(dǎo)致一些性能開銷,因?yàn)樵诿看潍@取Address對象時(shí)都需要?jiǎng)?chuàng)建一個(gè)新的對象。在實(shí)際應(yīng)用中,需要權(quán)衡不可變性和性能之間的取舍。
總之,要在Java中創(chuàng)建包含可變對象的不可變對象,關(guān)鍵是確保外部無法修改可變字段,并在getter方法中返回新的副本,以保持不可變性。
北京校區(qū)