자바 안전 코딩 안내 더미 오염
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 의 유형 은 고정 되 어 있 기 때문에 우 리 는 다시 할당 하 는 방식 으로 그것 을 수정 할 수 없습니다.이상 은 자바 안전 코딩 가이드 의 오염 에 대한 상세 한 내용 입 니 다.자바 안전 코딩 가이드 의 오염 에 관 한 자 료 는 다른 관련 글 을 주목 하 시기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.