인터페이스를 구현하는 클래스가 있습니다. 이 인터페이스를 구현하는 또 다른 클래스가 있습니다.이 두 번째 클래스의 인스턴스가 클래스 구현을 지원합니다.위임 상용구는 어떻게 줄일 수 있습니까?
인터페이스에서 지정한 많은 메소드의 경우, 클래스는 두 번째 클래스로 곧바로 전달합니다.
public class MyClass implements MyInterface
{
private OtherClass otherClassInstance; // Also implements MyInterface.
// ...
void foo() { otherClassInstance.foo(); }
void bar() { otherClassInstance.bar(); }
void baz() { otherClassInstance.baz(); }
// ...
}
은 간단하게이 모든 것을 제거하는 것이 두 번째 클래스에서 내 클래스를 파생하지만 두 클래스 (공통 인터페이스를 구현 이외의) 서로 관련이 있기 때문에 이해가되지 않습니다. 그것들은 다른 것을 나타냅니다. 많은 클래스의 클래스 구현이 다른 클래스의 구현을 복사하기 때문에 발생합니다. 즉, 제 클래스는 두 번째 클래스 위에 구현되지만 두 번째 클래스의 서브 세트 자체는 아닙니다. 아시다시피 상속은 구현을 공유하지 않고 "is-a"관계를 표현하기위한 것이므로이 경우 부적절합니다.
This 조슈아 블로흐 (Joshua Bloch)의 이야기의 일부가 상황을 잘 보여줍니다.
Java에 위임에 대한 언어 지원이 없다는 것을 알고 있습니다. 그러나 적어도 클래스의 구현을 정리할 수있는 방법이 없으므로 중복되지는 않습니까? 사용
Lemme은 ArrayList를 확장하려고하지만 모든 경우가 아니라 인터페이스가 그것을 잘라 내지 않습니다 ... 'MyList'가 대부분 ArrayList로 떨어지면 정말 이해할 수 있습니다. ArrayList를 확장하고 이에 따라 비 목록 목록을 처리합니다. – Shark
일반적으로 "MyList"에 대한 이유를 확인합니다. 대부분의 경우 ArrayList이며 어떤 경우에는 특별한 동작이 필요합니다. 이 상황에서는 ArrayList를 사용하고 Wrapper/Adapter/명령을 빌드하여 기능을 제공합니다. 그리고 대부분 구아바를 찾아 무료로 필요한 부분을 얻습니다. –
@Shark 아니요, ArrayList를 확장하고 싶지 않습니다. 나는'List'를 구현하기 위해 클래스를 만들고 있습니다.'ArrayList' 멤버는 단지 내 구현만을 뒷받침합니다. ArrayList 객체 대신에 MyList 객체를 사용하는 것은 의미가 없습니다. – Maxpm