java如何使一个包含日期对象的类不可变?
这只是从学术学习的角度来看。我所知道的是,每当我们想让某个类不可变, -它必须由最终的基本字段组成 -在构造对象期间,引用不会逃逸 -如果使用其他对象,那么这些对象也需要是递归不可变的,或者像java这样的API不可变类。朗·斯林,还有其他一些详细的了望
但我最近遇到了一个问题,面试官问一个应试者创建一个具有java语言的不可变类。util。在里面约会。我的第一印象是,这是不可能的,尽管我们可以通过包含日期字符串的字符串而不是日期对象本身来解决问题
请向我澄清这一点。谢谢
# 1 楼答案
在这里,要使类不可变,最简单的方法是创建日期对象的防御副本(当它在构造参数中传递时)。那么也不要提供任何二传手。这样,类外的代码就看不到对类中日期字段的引用,因此不能修改日期
查看Tom的评论,了解所需的getter特性!谢谢你的加入
(Getter也应该返回date字段的副本,因为date本身是可变的,更改Getter返回的字段也会更改类的字段。)
有关更多信息和详细信息: http://www.informit.com/articles/article.aspx?p=31551&seqNum=2
# 2 楼答案
我建议在使用日期前后创建一个包装器类,不要提供任何设置器或任何可以实际更改值的方法
为了使它不可变,你需要考虑以下事项:您需要确保该类不能被重写,将其设置为final
将所有字段设置为私有和最终字段
不要提供任何设置程序或任何更改实例变量的方法
防御性地在被调用方和调用方之间复制对象
考虑this tutorial以获得更多的