淺談java中unmodifiableList方法的應(yīng)用場(chǎng)景
java對(duì)象中primitive類型變量可以通過(guò)不提供set方法保證不被修改,但對(duì)象的List成員在提供get方法后,就可以隨意add、remove改變其結(jié)構(gòu),這不是希望的結(jié)果。網(wǎng)上看了下,發(fā)現(xiàn)Collections的靜態(tài)方法unmodifiableList可以達(dá)到目的。方法原型為:public static <T> List<T> unmodifiableList(List<? extends T> list);用法也很簡(jiǎn)單,傳入一個(gè)List實(shí)例la,返回這個(gè)list的只讀視圖lb,類型依然是List。之后對(duì)lb進(jìn)行add、remove等改變其內(nèi)容的操作將導(dǎo)致編譯不通過(guò)。
首先舉例描述問(wèn)題:
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可以解決這個(gè)問(wèn)題,將Student的getCourses改寫:
public List<String> getCourses(){
return Collections.unmodifiableList(this.courses);
}
再次執(zhí)行,編譯器提示出錯(cuò):
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
總結(jié),使用unmodifiableList可以保證對(duì)象的list內(nèi)容不被意料之外地修改,保證對(duì)象的封裝性。
以上這篇淺談java中unmodifiableList方法的應(yīng)用場(chǎng)景就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Android觸摸事件分發(fā)的原理詳析
觸摸事件分發(fā)機(jī)制一直以來(lái)都是Android中比較重要的一大塊,自定義view,各種復(fù)雜的自定義手勢(shì)交互都與觸摸事件分發(fā)機(jī)制關(guān)系密,下面這篇文章主要給大家介紹了關(guān)于Android觸摸事件分發(fā)原理的相關(guān)資料,需要的朋友可以參考下2022-01-01
java http連接池的實(shí)現(xiàn)方式(帶有失敗重試等高級(jí)功能)
這篇文章主要介紹了java http連接池的實(shí)現(xiàn)方式(帶有失敗重試等高級(jí)功能),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Java中Object類常用的12個(gè)方法(小結(jié))
Java 中的 Object 方法在面試中是一個(gè)非常高頻的點(diǎn),本文主要介紹了Java中Object類常用的12個(gè)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
深入學(xué)習(xí)SpringCloud之SpringCloud簡(jiǎn)介
Spring Cloud是一個(gè)一站式的開發(fā)分布式系統(tǒng)的框架,為開發(fā)者提供了一系列的構(gòu)建分布式系統(tǒng)的工具集,本文給大家介紹springcloud的相關(guān)知識(shí),感興趣的朋友跟隨一起看看吧2021-04-04
Java中Dijkstra算法求解最短路徑的實(shí)現(xiàn)
Dijkstra算法是一種解決最短路徑問(wèn)題的常用算法,本文主要介紹了Java中Dijkstra算法求解最短路徑的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
重試框架Guava-Retry和spring-Retry的使用示例
spring-retry 和 guava-retry 工具都是線程安全的重試,能夠支持并發(fā)業(yè)務(wù)場(chǎng)景的重試邏輯正確性,本文主要介紹了重試框架Guava-Retry和spring-Retry的使用示例,感興趣的可以一下2023-09-09
Maven添加Tomcat插件實(shí)現(xiàn)熱部署代碼實(shí)例
這篇文章主要介紹了Maven添加Tomcat插件實(shí)現(xiàn)熱部署代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
vscode快速引入第三方j(luò)ar包發(fā)QQ郵件
這篇文章主要介紹了vscode快速引入第三方j(luò)ar包發(fā)QQ郵件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

