방어 복사에서 활용


  1. class Period {
  2.         private final Date start;
  3.         private final Date end;
  4.         private static final Integer[] VALUES = { 123456 };
  5.         public static final Collection<Integer> C_VALUES = Collections.unmodifiableCollection(Arrays.asList(VALUES));
  6.         // 생성자에 방어복사를 (Defensive Copy)를 적용해야 한다.
  7.         // 인자의 유효성을 검사하기 전에 먼저 복사하고 나서 원본이 아닌 복사본의 유효성을 검사한다.
  8.         // -> 멀티쓰레드를 고려함.
  9.         public Period(Date start, Date end) {
  10.                 this.start = new Date(start.getTime());
  11.                 this.end = new Date(end.getTime());
  12.  
  13.                 if (this.start.compareTo(this.end) > 0) {
  14.                         throw new IllegalArgumentException(start + " after " + end);
  15.                 }
  16.         }
  17.  
  18.         // 접근자에도 방어복사가 적용되야한다.
  19.         public Date getStart() { // date.getStart().setYear(100);
  20.                 return (Date) start.clone();
  21.         }
  22.  
  23.         public Date getEnd() {
  24.                 return (Date) end.clone();
  25.         }
  26.  
  27.         @Override
  28.         public String toString() {
  29.                 return "Period [start=" + start + ", end=" + end + "]";
  30.         }
  31.  
  32. }
  33.  
  34. public class Ex2 {
  35.         public static void main(String... args) {
  36.                 Date start = new Date();
  37.                 Date end = new Date();
  38.                 Period p = new Period(start, end);
  39.                 System.out.println(p);
  40.                 // end.setYear(12); //setEnd()는 존재하지 않지만 date에 대한 setMethod로 깰수있다.
  41.                 System.out.println(p);
  42.                
  43. //              for (int i = 0; i < Period.VALUES.length; i++) {
  44. ////                    Period.VALUES[i] = 1; // final이 깨진다.
  45. //                      System.out.print(Period.VALUES[i]);
  46. //              }
  47.                 for (int val : Period.C_VALUES) {
  48.                         System.out.print(val);
  49.                 }
  50.         }
  51. }


'java > design_pattern' 카테고리의 다른 글

Factory method pattern  (0) 2014.06.27
Flyweight Pattern  (0) 2014.06.27
State Pattern  (0) 2014.06.27
Decorator Pattern  (0) 2014.06.27
Composite Pattern  (0) 2014.06.27

+ Recent posts