Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Lombok Immutable:用于制作参数深度副本的构造函数_Java_Functional Programming_Immutability_Lombok - Fatal编程技术网

Java Lombok Immutable:用于制作参数深度副本的构造函数

Java Lombok Immutable:用于制作参数深度副本的构造函数,java,functional-programming,immutability,lombok,Java,Functional Programming,Immutability,Lombok,如何获得一个构造函数,将构造函数参数的副本分配给字段,从而使实例真正不可变?下面的类有@Value注释,但这不是不变的,因为它的属性不是不变的:(这个问题不是针对不可变的集合的,我只是用它来演示一个可变的DS。我在这里寻找任何可变的bean来代替列表,比如说,它来自一个库,不在我的控制范围内) @Value 类ImmutableBean{ 列出道具; } @测试 void checkImmutability(){ var props=new ArrayList(); 添加道具(“abc”);

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

@Value
类ImmutableBean{
列出道具;
}
@测试
void checkImmutability(){
var props=new ArrayList();
添加道具(“abc”);
var immutableBean=新的immutableBean(道具);
System.out.println(immutableBean.getProps());//abc
添加道具(“pqr”);
System.out.println(immutableBean.getProps());//abc pqr
}

一个用lombook注释的类,默认情况下所有字段都是私有的和最终的,并且不会生成setter。这意味着一旦创建了对象,它是不可变的,例如,您不能使用setters方法重写该类的属性

@Test
void checkImmutability() {
    var props = new ArrayList<String>();
    props.add("abc");
    var immutableBean = new ImmutableBean(props);
    System.out.println(immutableBean.getProps()); // abc
    immutableBeansetProps(new ArrayList<>());  //compile time error

}
避免这种情况的唯一方法是您需要创建这些属性的不可变对象,例如,您可以创建不可变列表

var immutableBean = new ImmutableBean(Collections.unmodifiableList(props));
@Value是@Data的不可变变量默认情况下,所有字段都是私有的和最终的,并且不会生成setter。默认情况下,类本身也是最终的,因为不可变性不是强加于子类的东西。与@Data一样,还生成了有用的toString()、equals()和hashCode()方法,每个字段都得到一个getter方法,并且还生成了一个覆盖每个参数(字段声明中初始化的最终字段除外)的构造函数


对于Singleton类,您需要使用
@Singular
并将集合字段标记为
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
    }
}
import lombok.*;
导入java.util.ArrayList;
导入java.util.List;
@价值观
@AllArgsConstructor
@吸气剂
@建筑商
类ImmutableBean{
@奇异的
私人最终名单道具;
公共静态void main(字符串[]args){
List props=new ArrayList();
添加道具(“abc”);
ImmutableBean ImmutableBean=ImmutableBean.builder().props(props.build();
System.out.println(immutableBean.getProps());//abc
添加道具(“pqr”);
System.out.println(immutableBean.getProps());//abc
}
}

谢谢,但问题不在于塞特。这是关于如何避免不可变类的属性发生变异为什么不创建不可变列表并分配给它
集合。不可修改列表(props)
@GopalSAkshintalaBut这不是特定于
集合的,我只是用它来演示。如果一个可变bean代替了
列表
,我该如何实现呢?如果你有一个可变bean,让这个类也用
@Value
注释,那么它就变成了不可变的,你应该始终展示你面对问题的清晰例子,我知道,但是如果这个类来自一个不在我控制范围内的库呢?但是这不是特定于
集合的,我只是用它来演示。如果一个可变bean代替了
列表
,我该如何实现呢?遵循相同的过程使这些bean不可变,然后在需要将它们注入ImmutableBean的object@GopalSAkshintalaThis时使用或克隆它们。它可能无法处理我无法控制的对象,比如来自外部的对象库。仅在构造时复制是不够的,在返回getter之前,您也必须复制任何字段值。您能接受以下答案之一或解释这些答案不起作用的原因吗?嗨!我已经回复了在评论中的答案,请查收。
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
    }
}