effective java中的第 39个话题,大概说的就是这个意思,应该很容易明白
public class DataTest {
private final Date start;
private final Date end;
public DataTest(Date start, Date end) {
if(start.compareTo(end) > 0){
throw new IllegalArgumentException("时间不对");
}
this.start = start;
this.end = end;
}
public Date getStart() {
return start;
}
public Date getEnd() {
return end;
}
public static void main(String[] args) throws InterruptedException {
Date start = new Date();
Thread.sleep(2);
Date end = new Date();
DataTest dataTest = new DataTest(start, end);
System.out.println(dataTest.getStart().getTime());
System.out.println(dataTest.getEnd().getTime());
//第一种风险,修改start的属性值
start.setYear(2022);
System.out.println(dataTest.getStart().getTime());
System.out.println(dataTest.getEnd().getTime());
//第二种风险
dataTest.getStart().setYear(2022);
System.out.println(dataTest.getStart().getTime());
System.out.println(dataTest.getEnd().getTime());
}
}应对第一种风险,解决修改构造方法
public DataTest(Date start, Date end) {
if(start.compareTo(end) > 0){
throw new IllegalArgumentException("时间不对");
}
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
}应对第二种风险,解决修改get方法
public Date getStart() {
return new Date(start.getTime());
}
public Date getEnd() {
return new Date(end.getTime());
}
本文探讨了在Java中如何安全地处理日期对象的传递问题,通过具体示例介绍了如何避免外部修改内部日期对象的问题,并提出了两种解决方案:一是通过深拷贝创建不可变对象;二是返回对象的副本而非原始引用。
716

被折叠的 条评论
为什么被折叠?



