java.util.Date 克隆或复制以不公开内部引用
最好不要公开对象(实体)的内部引用。因此,如果一个对象有一个 java.util.Date
类型的字段,那么该字段的 getter 应该返回的不是原始日期,而是它的副本。
util.Date 有两种常见的方法来创建该副本:
- clone:
(Date) originalDate.clone()
- 通过构造函数复制
new Date(originalDate.getTime())
My问题是,哪种方式更好,并且 为什么?
It is best practice not to expose the internal references of an Object (Entity). So if an Object has a field of type java.util.Date
then for example the getter for this field should return not the original date but an copy of it.
But for an java.util.Date there are two common ways to create that copy:
- clone:
(Date) originalDate.clone()
- copy via constructor
new Date(originalDate.getTime())
My question is, which way is better, and why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果它绝对只是一个
Date
,那么无论哪种方式都没有任何区别。如果实际对象可能是 Date 的子类(例如 java.sql.Date),那么我希望克隆() 将保留额外信息(包括它是哪个类),而调用构造函数则不会。
顺便说一句,如果你使用 Joda Time 你就不会遇到这个问题,因为有很多不可变类型可以使用。这也是一个更好的 API :)
If it's definitely just a
Date
, it won't make any difference either way.If the actual object might be a subclass of
Date
(such asjava.sql.Date
) then I'd hope thatclone()
would preserve the extra information (including which class it is) whereas calling the constructor wouldn't.As an aside, if you used Joda Time you wouldn't have this problem, as there are plenty of immutable types to use. It's also a much better API :)
阅读Effective Java。创建副本的首选方法是使用复制构造函数方法。
Read Effective Java. The preferred way to create copies is to use the copy constructor approach.
如果您进行防御性编码,则需要复制构造函数。请参阅来自Effective Java 的这段文字:
If you're coding defensively, you'll want the copy constructor. See this passage from Effective Java: