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()); }