자바 안전 코딩 안내 더미 오염

3500 단어 자바퇴적 오염
더미 오염 의 예
JDK 5 가 범 형 을 도입 한 이상 왜 더미 오염 이 발생 하 느 냐 는 학생 들 의 질문 이 있 을 것 이다.
이것 은 좋 은 문제 입 니 다.예 를 들 어 봅 시다.

public void heapPollution1(){
    List normalList= Arrays.asList("www.flydean.com",100);
    List<Integer> integerList= normalList;
}
위의 예 에서,우 리 는 Arrays.asList 를 사용 하여 일반적인 List 를 만 들 었 다.
이 List 에는 int 와 String 두 가지 유형 이 포함 되 어 있 습 니 다.List 를 List 에 할당 할 때 자바 컴 파일 러 는 할당 List 의 유형 을 판단 하지 않 습 니 다.integerList 에는 Integer 가 아 닌 요 소 를 포함 하여 사용 할 때 오류 가 발생 할 수 있 습 니 다.
List 에 직접 값 을 부여 하고 유형 검 사 를 하지 않 습 니 다.만약 우리 가 List 에 요 소 를 직접 추가 한다 면?
우 리 는 아래 의 예 를 보 자.

private void addToList(List list, Object object){
    list.add(object);
}

@Test
public void heapPollution2(){
    List<Integer> integerList=new ArrayList<>();
    addToList(integerList,"www.flydean.com");
}
위의 예 에서 우 리 는 addToList 방법 을 정 의 했 습 니 다.이 방법의 매개 변 수 는 일반적인 List 이지 만 우 리 는 List 를 들 어 왔 습 니 다.
결과,우 리 는 list.add 방법 이 매개 변수 형식 검 사 를 하지 않 은 것 을 발견 했다.
위의 예 는 어떻게 수정 해 야 합 니까?
addToList 방법의 List 매개 변수 에 형식 검사 도 추가 해 야 합 니 다.

private void addToList(List<Integer> list, Object object){
    list.add(object);
}
만약 addToList 가 매우 통용 되 는 방법 이 라면 어떻게 합 니까?addToList 의 매개 변수 에 매개 변수 형식 을 추가 하 는 것 은 현실 적 입 니 다.
이 럴 때,우 리 는 Collections.checked List 방법 을 사용 하여 입력 한 List 를 checked List 로 변환 하여 특정한 유형의 요소 만 받 아들 이 는 것 을 고려 할 수 있다.

public void heapPollutionRight(){
    List<Integer> integerList=new ArrayList<>();
    List<Integer> checkedIntegerList= Collections.checkedList(integerList, Integer.class);
    addToList(checkedIntegerList,"www.flydean.com");
}
위의 코드 를 실행 하면 우 리 는 아래 의 이상 을 얻 을 수 있 습 니 다.
java.lang.ClassCastException: Attempt to insert class java.lang.String element into collection with element type class java.lang.Integer
보다 통용 되 는 예
위 에서 우 리 는 유형 판단 을 하지 않 았 기 때문에 오염 문제 가 발생 할 수 있 는 addToList 방법 을 정의 했다.
통용 할 수도 있 고 오염 도 피 할 수 있 는 방법 은 없 을 까?
물론 있 습 니 다.우 리 는 아래 의 실현 을 봅 니 다.

private <T> void addToList2(List<T> list, T t) {
    list.add(t);
}

public <T> void heapPollutionRight2(T element){
    List<T> list = new ArrayList<>();
    addToList2(list,element);
}
위의 예 에서 우 리 는 addToList 방법 에서 매개 변수 유형 T 를 정 의 했 습 니 다.이 를 통 해 우 리 는 List 중의 요소 유형의 일치 성 을 확보 합 니 다.
가 변 매개 변수
사실 방법 매개 변 수 는 가 변 적 일 수 있 습 니 다.우 리 는 다음 과 같은 예 를 고려 합 니 다.

private void addToList3(List<Integer>... listArray){
    Object[] objectArray = listArray;
    objectArray[0]= Arrays.asList("www.flydean.com");
    for(List<Integer> integerList: listArray){
        for(Integer element: integerList){
            System.out.println(element);
        }
    }
}
위의 예 에서 우리 의 매개 변 수 는 List 의 배열 입 니 다.List 의 요소 유형 이 고정 되 었 지만 우 리 는 매개 변수 배열 에 다시 값 을 부여 하여 실제 적 으로 매개 변수 유형 을 수정 할 수 있 습 니 다.
위의 addToList 3 방법 매개 변 수 를 아래 방식 으로 수정 하면 문제 가 발생 하지 않 습 니 다.

private void addToList4(List<List<Integer>> listArray){
이러한 상황 에서 List 의 유형 은 고정 되 어 있 기 때문에 우 리 는 다시 할당 하 는 방식 으로 그것 을 수정 할 수 없습니다.
이상 은 자바 안전 코딩 가이드 의 오염 에 대한 상세 한 내용 입 니 다.자바 안전 코딩 가이드 의 오염 에 관 한 자 료 는 다른 관련 글 을 주목 하 시기 바 랍 니 다!

좋은 웹페이지 즐겨찾기