首页 > 解决方案 > Lombok Immutable:构造参数的深拷贝

问题描述

如何获得一个构造函数,将构造函数参数的副本分配给字段,以使实例真正不可变?下面的类有@Value注释,但这不是不可变的,因为它的属性不是:(问题不是特定于 immutableCollections的,我只是用它来演示可变 DS。我正在寻找任何可变 bean 来代替List这里, ,比如说来自图书馆,不在我的控制范围内)

@Value
class ImmutableBean {
    List<String> props;
}
    @Test
    void checkImmutability() {
        var props = new ArrayList<String>();
        props.add("abc");
        var immutableBean = new ImmutableBean(props);
        System.out.println(immutableBean.getProps()); // abc
        props.add("pqr");
        System.out.println(immutableBean.getProps()); // abc pqr
    }

标签: javafunctional-programmingimmutabilitylombok

解决方案


对于 Singleton 类,您需要使用@SingularCollection 字段并将其标记为private final

import lombok.*;

import java.util.ArrayList;
import java.util.List;

@Value
@AllArgsConstructor
@Getter
@Builder
class ImmutableBean {

    @Singular
    private final List<String> props;

    public static void main(String[] args) {
        List<String> props = new ArrayList<>();
        props.add("abc");
        ImmutableBean immutableBean = ImmutableBean.builder().props(props).build();
        System.out.println(immutableBean.getProps()); // abc
        props.add("pqr");
        System.out.println(immutableBean.getProps()); // abc
    }
}

推荐阅读