방어 복사에서 활용
- class Period {
- private final Date start;
- private final Date end;
- private static final Integer[] VALUES = { 1, 2, 3, 4, 5, 6 };
- public static final Collection<Integer> C_VALUES = Collections.unmodifiableCollection(Arrays.asList(VALUES));
- // 생성자에 방어복사를 (Defensive Copy)를 적용해야 한다.
- // 인자의 유효성을 검사하기 전에 먼저 복사하고 나서 원본이 아닌 복사본의 유효성을 검사한다.
- // -> 멀티쓰레드를 고려함.
- public Period(Date start, Date end) {
- this.start = new Date(start.getTime());
- this.end = new Date(end.getTime());
- if (this.start.compareTo(this.end) > 0) {
- throw new IllegalArgumentException(start + " after " + end);
- }
- }
- // 접근자에도 방어복사가 적용되야한다.
- public Date getStart() { // date.getStart().setYear(100);
- return (Date) start.clone();
- }
- public Date getEnd() {
- return (Date) end.clone();
- }
- @Override
- public String toString() {
- return "Period [start=" + start + ", end=" + end + "]";
- }
- }
- public class Ex2 {
- public static void main(String... args) {
- Date start = new Date();
- Date end = new Date();
- Period p = new Period(start, end);
- System.out.println(p);
- // end.setYear(12); //setEnd()는 존재하지 않지만 date에 대한 setMethod로 깰수있다.
- System.out.println(p);
- // for (int i = 0; i < Period.VALUES.length; i++) {
- //// Period.VALUES[i] = 1; // final이 깨진다.
- // System.out.print(Period.VALUES[i]);
- // }
- for (int val : Period.C_VALUES) {
- System.out.print(val);
- }
- }
- }
'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 |