当前位置: 首页 > 编程笔记 >

浅谈java中unmodifiableList方法的应用场景

公羊俭
2023-03-14
本文向大家介绍浅谈java中unmodifiableList方法的应用场景,包括了浅谈java中unmodifiableList方法的应用场景的使用技巧和注意事项,需要的朋友参考一下

java对象中primitive类型变量可以通过不提供set方法保证不被修改,但对象的List成员在提供get方法后,就可以随意add、remove改变其结构,这不是希望的结果。网上看了下,发现Collections的静态方法unmodifiableList可以达到目的。方法原型为:public static <T> List<T> unmodifiableList(List<? extends T> list);用法也很简单,传入一个List实例la,返回这个list的只读视图lb,类型依然是List。之后对lb进行add、remove等改变其内容的操作将导致编译不通过。

首先举例描述问题:

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();

  }
}

执行结果:

Alice

18

Math

Chinese

Alice

18

Math

Chinese

English

虽然只有getCourse,但依然可以被加上1门English。使用unmodifiableList可以解决这个问题,将Student的getCourses改写:

public List<String> getCourses(){
    return Collections.unmodifiableList(this.courses);
  }

再次执行,编译器提示出错:

Exception in thread "main" java.lang.UnsupportedOperationException

at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)

总结,使用unmodifiableList可以保证对象的list内容不被意料之外地修改,保证对象的封装性。

以上这篇浅谈java中unmodifiableList方法的应用场景就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍谈谈Python的深浅拷贝?以及实现方法和应用场景。相关面试题,主要包含被问及谈谈Python的深浅拷贝?以及实现方法和应用场景。时的应答技巧和注意事项,需要的朋友参考一下 浅拷贝只是增加了一个指针指向一个存在的地址, 而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存, 采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误 一层的情况

  • 本文向大家介绍浅谈Java中的hashcode方法(推荐),包括了浅谈Java中的hashcode方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。

  • 本文向大家介绍浅谈java Iterator.remove()方法的用法(详解),包括了浅谈java Iterator.remove()方法的用法(详解)的使用技巧和注意事项,需要的朋友参考一下 实例如下: 以上这篇浅谈java Iterator.remove()方法的用法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 本文向大家介绍浅谈Node.js 子进程与应用场景,包括了浅谈Node.js 子进程与应用场景的使用技巧和注意事项,需要的朋友参考一下 背景 由于ons(阿里云 RocketMQ 包)基于 C艹 封装而来,不支持单一进程内实例化多个生产者与消费者,为了解决这一问题,使用了 Node.js 子进程。 在使用的过程中碰到的坑 发布:进程管理关闭主进程后,子进程变为操作系统进程(pid 为 1) 几种解

  • 本文向大家介绍浅谈Vue内置component组件的应用场景,包括了浅谈Vue内置component组件的应用场景的使用技巧和注意事项,需要的朋友参考一下 官方的说明 渲染一个“元组件”为动态组件。依 is 的值,来决定哪个组件被渲染。 具体可以官网文档中的 动态组件  内置的组件component 场景 这里通过一个业务场景来阐述vue内置component组件的应用。 如图所示,这里展示经典注

  • 本文向大家介绍浅谈java线程join方法使用方法,包括了浅谈java线程join方法使用方法的使用技巧和注意事项,需要的朋友参考一下 本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 打印出来的信息,都是这样的 执行时间:0 线程1:1 线程2:1 线程2:2 线程2:3 线程2:4 线程2:5 线