浅谈java中unmodifiableList方法的应用场景
java对象中primitive类型变量可以通过不提供set方法保证不被修改,但对象的List成员在提供get方法后,就可以随意add、remove改变其结构,这不是希望的结果。网上看了下,发现Collections的静态方法unmodifiableList可以达到目的。方法原型为:publicstatic
首先举例描述问题:
Student.java
packagecom.liulei.test;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.List;
/**
*CreatedbyLiuleion2017/5/31.
*/
publicclassStudent{
privateStringname;
privateintage;
privateListcourses;
publicStudent(){
courses=newArrayList();
}
publicStudent(Stringname,intage,Listcourses){
this.name=name;
this.age=age;
this.courses=courses;
}
publicListgetCourses(){
returnthis.courses;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
publicvoiddescribe(){
System.out.println(this.name);
System.out.println(this.age);
for(Stringcourse:courses){
System.out.println(course);
}
}
}
App.java
packagecom.liulei.test;
importjava.util.ArrayList;
importjava.util.List;
/**
*Helloworld!
*
*/
publicclassApp
{
publicstaticvoidmain(String[]args)
{
ArrayListcourses=newArrayList();
courses.add("Math");
courses.add("Chinese");
Studentstudent=newStudent("Alice",18,courses);
student.describe();
ListmyCourses=student.getCourses();
myCourses.add("English");
student.describe();
}
}
执行结果:
Alice
18
Math
Chinese
Alice
18
Math
Chinese
English
虽然只有getCourse,但依然可以被加上1门English。使用unmodifiableList可以解决这个问题,将Student的getCourses改写:
publicListgetCourses(){ returnCollections.unmodifiableList(this.courses); }
再次执行,编译器提示出错:
Exceptioninthread"main"java.lang.UnsupportedOperationException
atjava.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
总结,使用unmodifiableList可以保证对象的list内容不被意料之外地修改,保证对象的封装性。
以上这篇浅谈java中unmodifiableList方法的应用场景就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。