У меня есть класс, который реализует интерфейс. Есть еще один класс, который реализует этот интерфейс, и экземпляр этого второго класса поддерживает реализацию моего класса.Как уменьшить шаблон делегата?
Для многих методов, указанных интерфейсом, мой класс просто перенаправляет их прямо во второй класс.
public class MyClass implements MyInterface
{
private OtherClass otherClassInstance; // Also implements MyInterface.
// ...
void foo() { otherClassInstance.foo(); }
void bar() { otherClassInstance.bar(); }
void baz() { otherClassInstance.baz(); }
// ...
}
Просто получения моего класса со второго класса устранил бы все это, но это не имеет смысла, так как эти два класса не имеют никакого отношения друг к другу (помимо реализации общего интерфейса). Они представляют разные вещи - так получилось, что реализация моего класса копирует другой класс. Другими словами, мой класс реализуется поверх второго класса, но сам он не является подмножеством второго класса. Как известно, наследование предназначено для выражения отношения «есть-а», а не для совместного осуществления, поэтому в этом случае оно неуместно.
This часть беседы Джошуа Блоха хорошо иллюстрирует ситуацию.
Я знаю, что Java не поддерживает языковую поддержку для делегирования. Однако есть ли хоть какой-то способ очистить реализацию моего класса, чтобы он не был настолько избыточным?
Lemme получите это прямое ... вы хотите расширить ArrayList, но не в каждом случае, а интерфейс не режет его ... Это ваш 'MyList' падает в основном в ArrayList, тогда это действительно имеет смысл для расширения ArrayList, и соответственно обрабатывать списки неарюристов. – Shark
Обычно я проверяю причины «MyList». В большинстве случаев это ArrayList, и в некоторых случаях мне нужно особое поведение. Для этой ситуации я использую ArrayList и создаю Wrapper/Adapter/commands для обеспечения функциональности. И большую часть времени я смотрю на Гуаву и бесплатно получаю необходимые экстензии. –
@Shark Нет, я не хочу расширять 'ArrayList'. Я делаю свой собственный класс для реализации 'List', а член' ArrayList' просто поддерживает мою реализацию. Это не означает, что объект 'MyList' будет использоваться вместо объекта ArrayList. – Maxpm