gpt4 book ai didi

java - 如何在类中使用 List 元素创建不可变类

转载 作者:行者123 更新时间:2023-12-02 04:37:17 25 4
gpt4 key购买 nike

带有列表的不可变类

package com.text.immutable;

import java.util.Collections;
import java.util.List;

// An immutable class Student
public final class Student
{
final String name;
final int regNo;
final List<String> courses; // want to make Immutable

public Student(String name, int regNo, List<String> courses)
{
this.name = name;
this.regNo = regNo;
this.courses = Collections.unmodifiableList(courses);
}
public String getName()
{
return name;
}
public int getRegNo()
{
return regNo;
}

public List<String> getCourses() {
return courses;
}
}

测试不可变类以破坏不变性

package com.text.immutable;

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

class ImmutablityTest
{
public static void main(String args[])
{
List<String> courses = new ArrayList<String>();
courses.add("java");
courses.add("spring");
courses.add("hibernate");
courses.add("rest");

Student s = new Student("ABC", 101, courses);

System.out.println("Before Update List");
System.out.println(s.getName());
System.out.println(s.getRegNo());
System.out.println(s.getCourses());
courses.add("Hibernate"); // Able to Change which affect final OutCome
//s.getCourses().add("SpringBoot"); // giving Exception in thread "main" java.lang.UnsupportedOperationException

System.out.println("After Update List");
System.out.println(s.getName());
System.out.println(s.getRegNo());
System.out.println(s.getCourses());

}
}

输出为

Before Update List
ABC
101
[java, spring, hibernate, rest]
After Update List
ABC
101
[java, spring, hibernate, rest, Hibernate]

为什么以及如何将这个新的类(class)元素从客户端添加到列表中,因为它可以随时添加,所以我们如何解决这个问题,因为这个不可变的类在创建后不允许修改

最佳答案

this.courses = Collections.unmodifiableList(courses);

顾名思义,这将创建一个不可修改列表。但这只是原始列表中的 View 。因此,对该原始列表的更改将在您的“不可修改” View 中可见。

如有疑问:克隆您的列表,例如:

this.courses = new ArrayList<>(courses);

然后确保您的 getter 执行以下操作:

return Collections.unmodifiableList(courses);

关于java - 如何在类中使用 List<String> 元素创建不可变类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58482083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com