《코어 자바 2》독서 노트(2)

9035 단어 자바직장레저
1.방어 적 프로 그래 밍.필요 할 때 내부 의 개인 데 이 터 를 보호 하기 위해 보호 적 인 복사 수단 을 취해 야 한다.먼저 다음 과 같은 예 를 살 펴 보 자.

  
  
  
  
  1. pubic final class Period  
  2. {  
  3.     private final Date start;  
  4.     private final Date end;  
  5.       
  6.     public Period(Date start, Date end)  
  7.     {  
  8.         if (start.compareTo(end) > 0)  
  9.             throw new IllegalArgumentException(start + "after " + end);  
  10.         this.start = start;  
  11.         this.end = end;  
  12.     }  
  13.       
  14.     public Date getStart()  
  15.     {  
  16.         return start;  
  17.     }  
  18.     public Date getEnd()  
  19.     {  
  20.         return end;  
  21.     }  

이 종 류 는 두 개의 안전 하지 않 은 곳 이 있 습 니 다.먼저 첫 번 째 공격 코드 를 보 겠 습 니 다.

  
  
  
  
  1. Date start = new Date();  
  2. Date end = new Date();  
  3. Period p = new Period(start, end);  
  4. end.setYear(78);// p !  

외부 와 내부 에서 같은 데 이 터 를 인 용 했 기 때문에 이 문 제 를 해결 하기 위해 서 는 Period 의 구조 함 수 를 수정 해 야 합 니 다.

  
  
  
  
  1. public Period(Date start, Date end)  
  2. {  
  3.     this.start = new Date(start.getTime());  
  4.     this.end = new Date(end.getTime());  
  5.     if (start.compareTo(end) > 0)  
  6.         throw new IllegalArgumentException(start + "after " + end);  

이렇게 내부 의 개인 데 이 터 는 외부 대상 이 가리 키 는 것 과 다 르 면 외부 에 의 해 바 뀌 지 않 는 다.
두 번 째 공격 코드 를 보 겠 습 니 다:

  
  
  
  
  1. Date start = new Date();  
  2. Date end = new Date();  
  3. Period p = new Period(start, end);  
  4. p.getEnd().setYear(78);// p !  

이것 은 분명히 공유 방법 으로 내부 의 개인 데 이 터 를 노출 시 켰 기 때문에 우 리 는 내부 의 개인 데이터 만 읽 는 버 전(즉,복사)으로 돌아 갈 수 있다.

  
  
  
  
  1. public Date getStart()  
  2. {  
  3.     return (Date)start.clone();  
  4. }  
  5. public Date getEnd()  
  6. {  
  7.     return (Date)end.clone();  

2.위의 이 예 를 읽 고 다음 과 같은 코드 세 션 이 생각 났 습 니 다.

  
  
  
  
  1. public class Suit  
  2. {  
  3.     private final String name;  
  4.     private static int nextOrdinal = 0;  
  5.     private final int ordinal = nextOrdinal++;  
  6.       
  7.     private Suit(String name)  
  8.     {  
  9.         this.name = name;  
  10.     }  
  11.     public String toString()  
  12.     {  
  13.         return name;  
  14.     }  
  15.     public int compareTo(Object o)  
  16.     {  
  17.         return o  
  18.     }  
  19.     public static final Suit CLUBS = new Suit("Clubs");  
  20.     public static final Suit DIAMONDS = new Suit("diamonds");  
  21.     public static final Suit HEARTS = new Suit("hearts");  
  22.     public static final Suit SPADES = new Suit("spades");  
  23.       
  24.     private static final Suit[] PRIVATE_VALUES = {CLUBS,DIAMONDS,HEARTS,SPADES};  
  25.     public static final List VALUES = Collections.unmodifiedList(Arrays.asList(PRIVATE_VALUES));  
  26.       
  27.  

좋은 웹페이지 즐겨찾기