淺談java中unmodifiableList方法的應用場景
java對象中primitive類型變量可以通過不提供set方法保證不被修改,但對象的List成員在提供get方法后,就可以隨意add、remove改變其結(jié)構(gòu),這不是希望的結(jié)果。網(wǎng)上看了下,發(fā)現(xiàn)Collections的靜態(tài)方法unmodifiableList可以達到目的。方法原型為:public static <T> List<T> unmodifiableList(List<? extends T> list);用法也很簡單,傳入一個List實例la,返回這個list的只讀視圖lb,類型依然是List。之后對lb進行add、remove等改變其內(nèi)容的操作將導致編譯不通過。
首先舉例描述問題:
Student.java
package com.liulei.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Created by Liulei on 2017/5/31.
*/
public class Student {
private String name;
private int age;
private List<String> courses;
public Student(){
courses = new ArrayList<String>();
}
public Student(String name,int age,List<String> courses){
this.name = name;
this.age = age;
this.courses = courses;
}
public List<String> getCourses(){
return this.courses;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void describe(){
System.out.println(this.name);
System.out.println(this.age);
for (String course:courses){
System.out.println(course);
}
}
}
App.java
package com.liulei.test;
import java.util.ArrayList;
import java.util.List;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
ArrayList<String> courses = new ArrayList<String>();
courses.add("Math");
courses.add("Chinese");
Student student = new Student("Alice",18,courses);
student.describe();
List<String> myCourses = student.getCourses();
myCourses.add("English");
student.describe();
}
}
執(zhí)行結(jié)果:
Alice
18
Math
Chinese
Alice
18
Math
Chinese
English
雖然只有g(shù)etCourse,但依然可以被加上1門English。使用unmodifiableList可以解決這個問題,將Student的getCourses改寫:
public List<String> getCourses(){
return Collections.unmodifiableList(this.courses);
}
再次執(zhí)行,編譯器提示出錯:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
總結(jié),使用unmodifiableList可以保證對象的list內(nèi)容不被意料之外地修改,保證對象的封裝性。
以上這篇淺談java中unmodifiableList方法的應用場景就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Android觸摸事件分發(fā)的原理詳析
觸摸事件分發(fā)機制一直以來都是Android中比較重要的一大塊,自定義view,各種復雜的自定義手勢交互都與觸摸事件分發(fā)機制關(guān)系密,下面這篇文章主要給大家介紹了關(guān)于Android觸摸事件分發(fā)原理的相關(guān)資料,需要的朋友可以參考下2022-01-01
java http連接池的實現(xiàn)方式(帶有失敗重試等高級功能)
這篇文章主要介紹了java http連接池的實現(xiàn)方式(帶有失敗重試等高級功能),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
Java中Dijkstra算法求解最短路徑的實現(xiàn)
Dijkstra算法是一種解決最短路徑問題的常用算法,本文主要介紹了Java中Dijkstra算法求解最短路徑的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09
重試框架Guava-Retry和spring-Retry的使用示例
spring-retry 和 guava-retry 工具都是線程安全的重試,能夠支持并發(fā)業(yè)務場景的重試邏輯正確性,本文主要介紹了重試框架Guava-Retry和spring-Retry的使用示例,感興趣的可以一下2023-09-09
Maven添加Tomcat插件實現(xiàn)熱部署代碼實例
這篇文章主要介紹了Maven添加Tomcat插件實現(xiàn)熱部署代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04

