java如何使用类中的List<String>元素创建不可变类
带列表的不可变类
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]
为什么以及如何将这个新的课程元素作为其从客户端添加到列表中,以便我们可以随时解决这个问题,因为这个不可变的类在创建后不允许修改
# 1 楼答案
正如名字所说,这会创建一个不可修改的列表。但这只是原始列表中的视图。因此,对原始列表的更改将在“不可修改”视图中可见
怀疑时:克隆你的列表,比如:
然后确保你的getter能够:
# 2 楼答案
使用
Collections.unmodifiableList
,它会围绕原始列表创建一个包装器,并且该包装器对象是不可修改的。原始列表仍可以更新因此,为了使
List<String> courses
列表不可变,可以使用Apache collection公共库List<String> immutableList = com.google.common.collect.ImmutableList.of("Geeks", "For","Geeks");
ImmutableList已覆盖该列表。添加方法以始终引发异常
java.lang.UnsupportedOperationException
第二种方法是在构造函数内部创建列表
这样称呼:
# 3 楼答案
阅读about immutableLists你会发现,不可变和不可修改的不一样
我猜(从你的问题中)你期待的是一个不可修改的列表,而你只是没有创建它
参见this answer了解正确的解决方案