자바 함정 의 신중 함 은 입 참 으로 반환 값 을 상세 하 게 설명 합 니 다.

정상 적 인 상황 에서 자바 에 참 여 를 하 는 것 은 반환 값 으로 사용 하 는 것 을 권장 하지 않 습 니 다.코드 가 이해 하기 어렵 고 의미 가 명확 하지 않 은 문제 외 에 함정 을 묻 어 구덩이 에 들 어가 기 를 기다 리 고 있 을 수도 있다.
문제 배경
예 를 들 어 이런 코드 가 있다.

@Named
public class AService { 
private SupplyAssignment localSupply = new SupplyAssignment();
 @Inject
 private BService bervice;

 public List<Supply> calcSupplyAssignment()
  List<Supply> supplyList = bService.getLocalSupplyList(this.localSupply);
  …
  return supplyList;
 }
}

위의 코드,서비스 A 는 서비스 B 를 호출 하여 supply List 를 가 져 오 기 를 원 하지만 서비스 A 는 localsupply 의 상태 값 을 수정 하 기 를 원 합 니 다.calcSupply Assignment 인터페이스(되 돌아 오고 싶 지 않 은 유형)를 수정 하 는 것 을 피하 지 못 하고 localsupply 를 입 참 했 으 나 반환 값 으로 도 사 용 했 습 니 다.
서비스 B 코드 는 다음 과 같 습 니 다.

@Named
public class BService { 

public List<Supply> getLocalSupplyList (SupplyAssignment localSupply)
 SupplyAssignment supplyAssignment = this.getSupplyAssignment();
  //   localSupply        
  localSupply = supplyAssignment;
  …
  return supplyList;

 }
}

서비스 B 코드 내부 에서 서비스 A 의 입 참 localsupply 가 들 어 왔 습 니 다.다시 supply Assignment 에 의 해 할당 되 어 새 값 으로 돌아 가 기 를 바 랍 니 다.그러나 이렇게 하 는 것 은 무효다.
문제 의 원인
먼저 프로 그래 밍 언어 에서 매개 변수 전달 유형 을 살 펴 보 겠 습 니 다.
4.567917.값 전달(pass by value)은 함 수 를 호출 할 때 실제 매개 변 수 를 함수 에 복사 하여 전달 하 는 것 을 말 합 니 다.이렇게 함수 에서 매개 변 수 를 수정 하면 실제 매개 변수 에 영향 을 주지 않 습 니 다4.567917.인용 전달(pass by reference)은 함 수 를 호출 할 때 실제 매개 변수의 주 소 를 함수 에 직접 전달 하 는 것 을 말한다.그러면 함수 에서 매개 변수 에 대한 수정 은 실제 매개 변수 에 영향 을 줄 것 이다.
자바 프로 그래 밍 언어 는 포인터 개념 이 없 기 때문에 값 전달 을 사용 하기 때문이다.즉,방법 은 모든 매개 변수 값 의 복사 본 을 얻 었 고 방법 은 그 에 게 전 달 된 모든 매개 변수 변수의 내용 을 수정 할 수 없다.
따라서 상기 코드 에서 서비스 A 가 서비스 B 를 호출 할 때 서비스 B 의 매개 변수 인 localsupply 는 실제 서비스 A 의 localsupply 를 복사 한 것 이다.물론 이 두 가 지 는 모두 같은 주소 대상 인 supply Assignment 1 을 가리킨다.

서비스 B 내부 에서 매개 변수 localsupply 를 다시 할당 하 는 것 은 localsupply=supply Assignment 입 니 다.실제로 B 의 매개 변수 localsupply 에 대해 새로운 할당 을 했 을 뿐 B 의 매개 변수 localsupply 는 새로운 주소 대상 인 supply Assignment 2 를 가리 킵 니 다.

위의 그림 에서 뚜렷하게 볼 수 있 기 때문에 서비스 A 의 localsupply 와 B 의 매개 변수 localsupply 는 서로 다른 대상 을 가리 키 고 B 의 매개 변수 localsupply 에 대해 어떠한 수정 도 서비스 A 의 localsupply 의 원래 값 에 영향 을 주지 않 습 니 다.이것 이 문제 의 원인 이다.서비스 B 가 서비스 A 가 참여 한 상 태 를 수정 하고 변 경 된 값 을 서비스 A 에 게 되 돌려 주 기 를 원 하지만 효과 가 없다.
해결 방안
방안 1:입 참 은 반환 값 으로 사용 하지 마 십시오.
물론 이것 은 가장 뚜렷 하고 이해 하기 쉬 운 것 이지 만 일부 인터페이스의 반환 유형 에 변화 가 생 길 수 있다.
때때로 참 여 를 반환 값 으로 삼 고 싶 을 때 가 있다.그것 은 방안 2 를 본다.
프로젝트 2:새 대상 에 값 을 부여 하지 마 십시오.
이 방안 은 입 참 대상 에 직접 상 태 를 수정 하고 새로운 대상 을 부여 하지 않 는 것 이다.아니면 이 그림:

이 그림 에서 우리 가 B 의 인자 인 localsupply 에서 supply Assignment 1 의 상태 값 을 수정 하면 결 과 는 서비스 A 의 localsupply 에 피드백 할 수 있 습 니 다.어떻게 실현 합 니까?다음 코드 를 보 세 요:

@Named
public class BService { 

 public List<Supply> getLocalSupplyList (SupplyAssignment localSupply)
  
  SupplyAssignment supplyAssignment = this.getSupplyAssignment();

  //   localSupply      ,        
  BeanUtils.copyProperties(supplyAssignment, localSupply);
  …
  return supplyList;

 }

}

위의 방법 에서 우 리 는 Spring 의 도구 류 BeanUtils 를 사 용 했 습 니 다.이러한 copy Properties 방법의 실질 은 supply Assignment 의 속성 값 을 local Supply 의 속성 에 할당 하 는 것 입 니 다.이것 은 우리 가 수 정 된 B 의 인자 localsupply 의 속성 이지 새 대상 이 아니 라 는 것 을 의미한다.
참조 참조
자바 핵심 프로 그래 밍
자바 함정 의 신중 함 을 반환 값 으로 사용 하 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 의 신중 함 을 반환 값 으로 사용 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기