2013-07-27 3 views
1

아무도 코드 행이 작동하는 방법이 설명 할 수 작동?어떻게 중첩 된 메소드 호출

+1

sum가 찾아 "메소드 체인"을 반환합니다. 그리고 객체 b는 메소드를받지 못합니다. 메서드로 매개 변수로 전달됩니다. –

답변

4

이것을 method chaining이라고합니다. 메서드 add()은 실제로 메서드가 호출 된 현재 수정 된 개체 또는 동일한 유형의 새 개체에 대한 참조를 반환합니다. a에 의해 참조 된 개체가 BigInteger 인 경우 a.add(b)을 호출하면 a+bBigInteger 개체가 반환되므로 해당 개체에서 .add(c)을 다시 호출 할 수 있습니다.

Rational sum = a.add(b).add(c); 
// is equivalent to 
Rational temp = a.add(b); 
Rational sum = temp.add(c); 

메서드 체이닝이 필요하지 않습니다. 잠재적으로는 가독성을 향상시키고 소스 코드의 양을 줄입니다. fluent interface을 구축하는 것이 핵심 개념입니다.

샘플 그림이 연습 Builder pattern에 주로 사용되는

enter image description here

, 당신은 StringBuilder 클래스의 API 자체에서이 패턴을 찾을 수 있습니다.

개체 b (인수)가 메서드를받는 방식을 이해하지 못합니까?

없음 이해가 a.add(b) 당신이 개체 a에 방법 add()를 호출하고 그것을 객체 b의 참조를 전달하는 것을 의미, 잘못 없다. a.add(b) 메서드가 반환하는 결과 개체는 a과 동일한 형식이며, 연속적으로 개체 c의 참조를 해당 메서드에 전달하여 반환 된 개체에 대해 .add(c) 메서드를 호출합니다.

+0

JLS, 컴파일러 또는 언어에서 설정 한 체이닝 깊이에 기술적 인 제한이 있습니까? – hexafraction

+0

@hexafraction 나는 어떤 것도 모르고 연구 할 필요가있다. – NINCOMPOOP

+1

분명히 * 명료도 * 제한이 있습니다! –

1

Its fluent chaining

체인의 각 메소드는 클래스 또는 인터페이스를 반환한다. 체인의 다음 메소드는 리턴 된 클래스의 일부 여야합니다.

귀하의 경우 a.add(b) 일부 CALSS/인터페이스를 반환하고 그 다음에 add(c)를 호출에

그 방법은

관련 문제