码迷,mamicode.com
首页 > 其他好文 > 详细

Software Construction Series(2)

时间:2018-04-02 21:14:29      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:ble   static   info   arraylist   不可变   ons   java   cat   子类   

Collections.unmodifiable*()与Rep Exposure

JDK在collections接口中提供了一类静态函数:collections.unmodifiable*(),其中*匹配Collections的子类。

如图:

技术分享图片

简而言之:这类函数返回一个相应对象的不可更改的Copy。

问题在于不可更改性到那种程度:

1、相当于final?(即reference不可变)

2、相当于imutable?(即集合本身内容不可变,其中元素仍可变)

3、相当于can‘t do anything?(即集合本身不可变,其中元素不可变)

做了如下测试:

package tests;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class list_test {
  List<Pair> list = new ArrayList<>();

  public void add(Pair a) {
    list.add(a);
  }

  public Pair get(int i) {
    return list.get(i);
  }

  public List<Pair> getUnmodified() {
    return Collections.unmodifiableList(list);
  }



  public static void main(String[] args) {
    list_test a = new list_test();

    Pair x = new Pair(1, 1);
    a.add(x);

    List<Pair> u = a.getUnmodified();
    u.get(0).Set(0, 0);
    System.out.println(u.get(0).getX() + "," + u.get(0).getY());
    System.out.println(a.get(0).getX() + "," + a.get(0).getY());

    try {
      u.add(x);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}


class Pair {
  private int x;
  private int y;

  public Pair(int x, int y) {
    this.x = x;
    this.y = y;
  }


  public void Set(int x, int y) {
    this.x = x;
    this.y = y;
  }

  public int getX() {
    return x;
  }

  public int getY() {
    return y;
  }
}

Output:

0,0
0,0
java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
    at tests.list_test.main(list_test.java:36)

分析:

unmodifiable的效果为2,相当于imutable(即集合本身内容不可变,其中元素仍可变)。

所以对于要防止数据泄露, 不仅要返回一个unmodifiable的集合对象,还需要其中的元素也是imutable的才行。

Software Construction Series(2)

标签:ble   static   info   arraylist   不可变   ons   java   cat   子类   

原文地址:https://www.cnblogs.com/KarlZhang/p/8697369.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!