乐鱼电竞

  • 教育行业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 分享到:
    和我们在线交谈!
    【网站地图】【sitemap】