如何使用Date对象使一个类不可变?

xpl*_*raj 8 java date immutability

这只是从学术学习的角度来看.我所知道的是,每当我们想要使一些类不可变时 - 它必须由最终的原始字段组成 - 引用在构造对象期间不会转义 - 如果使用其他对象,那么这些对象也需要递归不可变或API不可变像java.lang.String这样的类,还有一些其他详细的了望台!

但是我最近遇到了一个问题,其中一位采访者要求候选人创建一个包含java.util.Date的不可变类.我的第一印象告诉我,尽管我们可以使用包含日期字符串的字符串而不是Date对象本身的变通办法来实现它.

请澄清一下.谢谢.

Dru*_*ope 17

这里使类不可变的最简单的方法是创建Date对象的防御副本(当它在构造参数中传递时).那么也不要提供任何setter.像这样,类中的Date字段的引用对于该类之外的代码是可见的,因此不能修改Date.

请参阅Tom对所需吸气剂特性的评论!谢谢你的补充.

(Getter也应返回日期字段的副本,因为Date本身是可变的,并且从getter更改返回的字段也会更改类的字段.)

有关更多信息和详细信息,请访问:http://www.informit.com/articles/article.aspx?p = 31551& seqNum = 2

  • 如果需要像`public Date getDate(){}`这样的getter方法,那么也在那里创建一个副本:`return new Date(privateDate.getTime());`. (7认同)

shi*_*ari 5

我建议围绕您使用的日期创建一个包装类,不要提供任何可以实际更改值的setter或任何方法.

为了使它不可变,你需要考虑以下事项:

  1. 您需要确保不能覆盖该类, - 将其作为最终版本.
  2. 将所有字段设为私有和最终字段.
  3. 不要提供任何更改实例变量的setter或任何方法.
  4. 防御性地在被调用者和调用者之间复制对象.

    考虑本教程了解更多信息