教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

我们能创建一个包含可变对象的不可变对象吗?

更新时间:2023年08月15日09时54分 来源:传智教育 浏览次数:

好口碑IT培训

  在Java中,创建一个包含可变对象的不可变对象是一项相对复杂的任务,因为不可变对象的核心特性是其状态在创建后不能被修改。但是,如果我们需要在不可变对象内部包含可变对象,可以采用一些策略来实现这一目标。

  让我们以一个具体的例子来说明:假设我们要创建一个不可变的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;
    }
}

  然后,我们可以尝试创建一个不可变的Person类,其中包含一个Address对象作为其字段:

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

    public Person(String name, Address address) {
        this.name = name;
        // 这里我们需要创建一个新的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字段,但是在构造函数和getter方法中,我们都会返回一个新的Address对象,以确保外部无法修改原始的Address对象。这样一来,尽管Person类内部包含可变的Address对象,但由于外部无法修改这些可变对象,从外部来看,Person类仍然表现为不可变对象。

  需要注意的是,虽然这种方法可以实现包含可变对象的不可变对象,但它可能会导致一些性能开销,因为在每次获取Address对象时都需要创建一个新的对象。在实际应用中,需要权衡不可变性和性能之间的取舍。

  总之,要在Java中创建包含可变对象的不可变对象,关键是确保外部无法修改可变字段,并在getter方法中返回新的副本,以保持不可变性。

0 分享到:
和我们在线交谈!