浅谈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,List courses){ this.name=name; this.age=age; this.courses=courses; } publicList getCourses(){ 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(); List myCourses=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方法的应用场景就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。