当前位置: 首页 > 知识库问答 >
问题:

如何在java中创建不可变列表?

皮安顺
2023-03-14

我需要将可变列表对象转换为不可变列表。java中可能的方法是什么?

public void action() {
    List<MutableClass> mutableList = Arrays.asList(new MutableClass("san", "UK", 21), new MutableClass("peter", "US", 34));
    List<MutableClass> immutableList = immutateList(mutableList);
}

public List<MutableClass> immutateList(List<MutableClass> mutableList){
    //some code here to make this beanList immutable
    //ie. objects and size of beanList should not be change.
    //ie. we cant add new object here.
    //ie. we cant remove or change existing one.
}
final class MutableClass {
    final String name;    
    final String address;
    final int age;
    MutableClass(String name, String address, int age) {
        this.name = name;
        this.address = address;
        this.age = age;
    }
}

共有3个答案

陶永望
2023-03-14
匿名用户

使用集合。unmodifiableList()。您传入原始的数组列表,它返回一个列表,如果您试图添加、删除或移位元素,该列表会引发异常。例如,使用返回集合。不可修改列表(beanList)而不是返回beanList 位于getImmutableList()的末尾main()将引发异常。除列表外,集合类还具有用于所有其他常见集合类型的方法。

长孙泉
2023-03-14

JDK 8中:

List<String> stringList = Arrays.asList("a", "b", "c");
stringList = Collections.unmodifiableList(stringList);

在JDK 9中:

List stringList = List.of("a", "b", "c");

参考

管梓
2023-03-14

初始化beanList后,您可以执行以下操作:

beanList = Collections.unmodifiableList(beanList);

使其不可修改。(参见不可变与不可修改集合)

如果你有两个内部方法应该能够修改列表和公共方法不应该允许修改我建议你这样做

// public facing method where clients should not be able to modify list    
public List<Bean> getImmutableList(int size) {
    return Collections.unmodifiableList(getMutableList(size));
}

// private internal method (to be used from main in your case)
private List<Bean> getMutableList(int size) {
    List<Bean> beanList = new ArrayList<Bean>();
    int i = 0;

    while(i < size) {
        Bean bean = new Bean("name" + i, "address" + i, i + 18);
        beanList.add(bean);
        i++;
    }
    return beanList;
}

(您的Bean对象似乎已经是不可变的。)

附带说明:如果您碰巧使用Java8,您的getMutableList可以表示如下:

return IntStream.range(0,  size)
                .mapToObj(i -> new Bean("name" + i, "address" + i, i + 18))
                .collect(Collectors.toCollection(ArrayList::new));

 类似资料:
  • 我有一个Java/Kotlin互操作问题。一个Kotlin不可变列表被编译成一个普通的java.util.ArrayList,它是可变的! 静态编程语言(库): Java(消费者): 如何使我的 Kotlin 类从 Java 的角度来看也是完全不可变的?

  • 问题内容: 我有Java / Kotlin互操作问题。Kotlin不可变列表被编译为可变的普通java.util.ArrayList! Kotlin(图书馆): Java(消费者): 从Java的角度来看,如何也使我的Kotlin类完全不可变? 问题答案: 默认情况下,Kotlin中的所有非集合都是 编译时只读类型 ,但不是 不可变的 。请参见以下代码段: 要真正拥有一个不变的列表,请考虑Guav

  • 问题内容: 如何在Swift中创建不可变数组? 简要阅读文档会建议您可以做 但是可悲的是,这实际上产生了一个可变的,固定大小的数组。这种可变性通常会产生令人困惑的别名和令人怀疑的别名,并且函数会改变其参数: 没有比C好多少了。 如果我想要不变性,最好的选择是将其包装成这样: 好像疯了。我在这里想念什么? 更新(2015-07-26): 这个问题可以追溯到Swift的早期。从那以后,对Swift进行

  • Kotlin有一个const关键字。但我不认为kotlin中的常数是我所认为的。这似乎与C中的const非常不同。在我看来,its仅适用于静态成员和Java中的原语,不针对类变量进行编译: 由于这似乎不起作用,我认为我真正想要的是第二个类,它删除我不想支持的操作: 这种方法的明显缺点是,我不能忘记更改这个类,以防我更改,这对我来说非常危险。 但是我不确定如何做到这一点。所以问题是:如何用意识形态静

  • 我不熟悉java和springboot。我正在尝试使用springboot创建一个CRUD应用程序。我使用MySQL存储数据。 员工模式- 员工资源库- 员工控制员- 上面的控制器在JSON对象数组表单中给出了结果,如下所示 但我需要以下表格的回复 非常感谢你的帮助。

  • 我有一个名为MarkerCustom的类文件。MarkerCustom有一个构造函数,它接受三个不同类型的变量。 从我的main Main活动中,我希望加载一个GLSurface视图,该视图将获取MarkerCustom的每个实例的ArrayList,我希望将这些实例与将传递给MarkerCustom的构造函数的每个实例的数据一起加载到GLSurface中。 让我们调用数组列表; 我需要看起来像这