1 package com.twoslow.cha7; 2 3 import java.util.Date; 4 5 public final class Period { 6 7 private final Date start ; 8 private final Date end ; 9 10 public Period(Date start , Date end) { 11 if(start.compareTo(end) > 0) 12 throw new IllegalArgumentException(start +" after " +end) ; 13 this.start = start ; 14 this.end = end ; 15 } 16 17 public Date start() { 18 return start ; 19 } 20 21 public Date end() { 22 return end ; 23 } 24 25 26 @Override 27 public String toString() { 28 return "Period [start=" + start + ", end=" + end + "]"; 29 } 30 31 public static void main(String[] args) { 32 Date start = new Date() ; 33 Date end = new Date() ; 34 Period p = new Period(start, end) ; 35 System.out.println(p); 36 end.setYear(98);//改变了内部end对象 37 System.out.println(p); 38 } 39 }
1 public Period(Date start , Date end) { 2 // if(start.compareTo(end) > 0) 3 // throw new IllegalArgumentException(start +" after " +end) ; 4 // this.start = start ; 5 // this.end = end ; 6 /* 7 * 保护性拷贝是在检查参数的有效性之前进行的,并且有效性是针对拷贝之后的对象,而不是针对原始的对象。 8 * 没有使用clone方法,因为Date是非final的,不能保证clone方法一定返回类为java.util.Date的对象。 9 */ 10 this.start = new Date(start.getTime()) ; 11 this.end = new Date(end.getTime()) ; 12 if(start.compareTo(end) > 0) 13 throw new IllegalArgumentException(start +" after " +end) ; 14 } 15 16 public Date start() { 17 return new Date(start.getTime()) ; 18 } 19 20 public Date end() { 21 return new Date(end.getTime()) ; 22 }
PS:长度非0的数组总是可变的。 在把内部数组返回给客户端之前,应该总要进行保护性拷贝。另一种方案是,给客户端返回该数组的不可变视图。见:http://www.cnblogs.com/twoslow/p/3937657.html
时间: 2024-10-10 01:03:16