A라는 "엔터티"(인터페이스)를 정의하는 응용 프로그램이 있고 AImpl이 함께 있다고 가정 해 보겠습니다. 그리고 클래스 A를 B, C, .. Z (BImpl, ...)로 확장 한 써드 파티 플러그인이 있으며 각각은 몇 가지 상태와 기능을 추가합니다. 또한 응용 프로그램에 A 인스턴스를 생성하는 "팩토리"가 있습니다.런타임시 여러 Java 클래스 *를 병합하는 방법 *?
내 "사용자"가 F, K 및 W와 같이 여러 개의 플러그 인을 동시에로드하여 해당 팩터 리를 생성하지 못하게하고 싶습니다. F, K 및 W와 동시에있을 "수퍼 A"인스턴스. "수퍼 A"가 F, K 및 W의 인터페이스를 구현하는 한 "인터페이스"및 "구현"이 엄격하게 구분되어 있다고 가정합니다 , 그것은 FImpl, KImpl 또는 WImpl이 아니라는 것을 명심해야합니다. 그래서 일종의 "런타임"다중 상속.
정확히 말해서 F, K 또는 W 소스 코드가 없으므로 타사 개발자는 각자 확장 기능에 대해 알 필요가 없습니다.
그래서 Java 클래스를 쉽게 병합 할 수있는 라이브러리가 있습니까? 이상적으로는 "충돌"을 관리하는 몇 가지 방법, 예를 들어 동일한 서명을 사용하는 개인 메서드를 정의하는 두 클래스 또는 동일한 기본 클래스 메서드를 재정의하려는 경우에 유용합니다.
참고 : 구성보다는 바이트 코드 조작을 사용하여 찾고 있습니다. 컴포지션은 기본 클래스의 재정의 메소드의 "확장"클래스를 방지하고 더 많은 메모리를 사용합니다.
[편집] @Gray에 대한 내 의견에 설명했듯이 컴포지션은 여러 가지 이유로 좋은 해결책이 아닙니다. 당신이 그것을 할 수있는 동안, 당신이 제대로한다면, 아주 작은 클래스들과 인터페이스들, 그리고 그것들을 하나의 단일 객체처럼 보이게하는 다량의 글루 코드로 마무리하게됩니다. 이는 또한 생산성 저하로 이어지는 큰 코딩 오버 헤드 외에도 응용 프로그램이 훨씬 많은 메모리를 사용하며 모든 방향의 추가 된 우회로 인해 훨씬 더 느려지는 효과도 있습니다.
작고 짧은 DB 트랜잭션을 처리하는 응용 프로그램의 경우 컴포지션이 완벽 할 수 있지만 항상 RAM에 기가 바이트의 핫 데이터를 유지해야하는 응용 프로그램의 경우에는 이것이 수행됩니다. 실제 비용, 개발 시간 및 클라이언트 및 서버에 대한 메모리 및 CPU 요구 사항.
확장 할 수있는 기본 클래스의 메서드에 대한 제한이있는 "자연스럽게"(인터페이스 우선 스타일의 프로그래밍 IS입니다) 코드를 작성할 수있는 솔루션은보다 "저렴합니다" 구성.
정확히 무엇인지 찾고 싶지만 [Decorator Pattern] (http://en.wikipedia.org/wiki/Decorator_pattern)이 도움이 될 수 있습니다. – jpm
어떻게 갈등을 해결할 계획입니까? –
@Dave Newton Strategy-Pattern과 Design-For-Extension이 혼합되어 충돌을 줄이거 나 없애는 데 도움이됩니다. 좋은 점은 특정 충돌이 자동으로 관리 될 수 있다는 것입니다. 예제는 객체/값의 "집합"을 반환하는 메서드 (순서가 지정된 목록이 아님), "전체", "필터"메서드 및 기타 메서드를 반환하는 메서드입니다. 갈등을 관리하는 것이 가장 복잡한 부분입니다. 그래서 나는 나를 위해 그것을하는 라이브러리를 찾고 싶었습니다. –