2011-08-02 4 views
0

2 개의 라이브러리를 사용하고 있으며 다른 라이브러리의 기능을 사용하려면 라이브러리 중 하나의 클래스가 필요합니다. 첫 번째 시도는 라이브러리 A의 소스를 가져 와서 클래스 B가 라이브러리 B에서 클래스를 확장하도록하는 것입니다.이 코드는 안정적인 코드로 만들지 않고 라이브러리 중 하나를 업데이트하지 않는 등의 방법을 제외하고는 다소 효과적입니다. 지옥. 이 같은클래스의 인스턴스에서와 같은 성능/유연성

는 :

abstract class newClass extends classB{ 
    private classA A = new classA(); 

    public void exampleMethod(){ 
     A.exampleMethod(); 
    } 
} 

두 번째 옵션 나쁜 성능 현명하다 :

abstract class classA extends classB{ 
} 

는 지금은이 같은 일을 생각? 그리고 만약 그렇다면, 얼마나 나빠요?

+0

무엇 classB''에'exampleMethod을()'이동에 대한 : -

그리고 마지막 게을리하지 않는 JIT는 (그에게 친절하고 공급) 당신의 친구입니까? 이 문제를 해결하려면보다 구체적인 예가 더 쉬울 것입니다. 그런데 클래스와 필드의 이름을 다시 확인하십시오. Java 코딩 규칙 – powerMicha

+0

그런 다음 라이브러리에서 클래스를 다시 변경하고 싶습니다. 제거 할 항목이 있습니다. 제 개인적인 경우에는 모든 기능을 보존하기 위해 결합해야하는 많은 수퍼 클래스에 의존하는 두 개의 거대한 라이브러리를 결합하는 것이 좋습니다. – Tim

답변

2

위임 서식 (mixin)을 통한 확장은 여기에 여러 가지 이유로 바람직하지만, 비공식적 인 방식으로 타사 라이브러리 클래스를 확장 할 가능성이 가장 높습니다.

그러나 우리는 이 아니기 때문에이 모든 것이 추측됩니다. 어떤 라이브러리에 대해 이야기하고 있습니까? 예를 들어, classA (예제 사용)이 실제로 확장되지 않아야하지만 저자가 사양 final class classA 등을 무시한 서술 라이브러리 인 것일 수 있습니다. 그럴 경우 명확하게 원하지 않습니다. 그 수업을 연장하십시오 (가능한 경우에도).

당신이 (a) 공유 기능 만 필요로한다는 점을 감안할 때, (b) 다형성 의미론을 요구하지 않는다면, 위임 된 양식은 완벽한 의미를 갖습니다.

성능 불안에 관한 조언 : 벤치마킹.

final private classA A = new classA(); 
+0

'A' 결승전을하는 것이 좋은 생각인데 동의하지만 JIT에 어떤 영향을 미치는지는 알 수 없습니다. –

+0

결승전은 위임 된 콜 스택 (참조)이 절대로 변경되지 않고 어떠한 경험적 방법도없이 붕괴 될 수 있다는 것을 결정적으로 JIT에게 알려야합니다. (일단 당신이 덥 으면 당신이 맞다고 믿습니다.) – alphazero

2

글쎄, 에릭 감마는 GoF 책의 1 장에서 "개체 합성을 통해 클래스 상속을 권장합니다."라고 적었습니다. 참조 : http://www.artima.com/lejava/articles/designprinciples4.html.

+0

그가 누구인지는 알 수 없지만 그의 주장은 객체 구성을 사용하여 프로토 타입을 만들 때 충분히 유효하다고 보입니다 – Tim

+2

즉, 조기 최적화를 피하십시오. – musiKk

관련 문제