Производительность / гибкость, как в случае с классом или расширить его - PullRequest
0 голосов
/ 02 августа 2011

Я использую 2 библиотеки, и мне нужен класс из одной библиотеки, чтобы иметь функциональность из другой. Моей первой попыткой было взять исходный код библиотеки A и заставить класс расширить класс из библиотеки B. Это работает довольно хорошо, за исключением множества исправлений и т. Д., Которые не делают код настолько стабильным и т. Д., И обновление одной из библиотек стало ад.

как это:

abstract class classA extends classB{
}

Теперь я тоже думал о том, чтобы сделать что-то вроде этого:

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

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

Второй вариант плох по производительности? и если это так, то как плохо?

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Расширение с помощью формы делегирования (mixin) здесь желательно по ряду причин, но наиболее уместным является то, что вы (вероятно) расширяете классы сторонних библиотек ненормативным образом.

Но это все догадки, так как мы понятия не имеем о каких библиотеках вы говорите.Например, может случиться так, что это плохо написанная библиотека, в которой classA (используя ваш пример) действительно не предполагается расширять, но автор пренебрег спецификацией final class classA и т. Д. Если бы это было так, то вы явноне хочу расширять этот класс (даже если можете).

Все это говорит, учитывая тот факт, что вам (а) нужна только общая функциональность, (б) не требуется полиморфная семантика, делегированная форма делаетсовершенное чувство.

Советы относительно беспокойства по поводу производительности: сравните его.

И не пренебрегай финалом - JIT - твой друг (будь добр к нему и накорми его):

final private classA A = new classA();
2 голосов
/ 02 августа 2011

Ну, Эрих Гамма в 1-й главе книги GoF заявляет: «Подарите композицию объекта наследованию классов».См .: http://www.artima.com/lejava/articles/designprinciples4.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...