如何在番石榴中创建Date对象的"真实"不可变列表

Jef*_*iao 1 java date immutability guava

如何使用guava创建一个不可变的日期列表(java.util.Date)?

我有这个片段:

    Date date = new GregorianCalendar(2014, 4, 1).getTime();    

    // doesn't work: 
    // List<Date> immutableList = ImmutableList.of(date);
    // doesn't work either:
    List<Date> immutableList = ImmutableList.copyOf(new Date[] { date });

    date.setMonth(3);

    System.out.println("immutableList has: " + immutableList.get(0));
Run Code Online (Sandbox Code Playgroud)

而我想让它成为一个"真正的"不可变列表,以便在更改date对象时不会更改第0个元素.

Rob*_*sen 7

正如您已经发现的那样,使用不可变列表可以保护列表不被修改,但不会保护列表中包含的元素.为此,元素本身必须是不可变的.

不幸的是,不可能创建不可变java.util.Date对象.您可以考虑几种方法:

  1. 如果您使用的是Java 8,请使用JSR-310引入的不可变日期/时间值类.你可以在这里找到一篇介绍性文章.
  2. 如果您不使用Java 8,最好的办法是使用Joda Time库中的不可变类.
  3. 编写自己的日期包装类,以保护包装日期对象不被修改.
  4. 虽然类型的对象java.util.Date是可变的,但类型的对象java.lang.Long是不可变的.
    因此,您可以创建一个不可变的Long对象列表来存储long从调用中获取的值Date.getTime(),并Date(long date)在从列表中检索时使用构造函数动态构造新的日期对象.