Обойти статические методы диспетчеризации Java без шаблонов Double Dispatch/Visitor
Я использую класс Foo
что обеспечивает эти методы:
String overloadedMethod(Object)
String overloadedMethod(Goo)
Поскольку Java статически отправляет аргумент не получателя, я не могу просто передать свой value
(который является Object
, но может иметь динамический тип Goo
) и полагаться на JVM для динамического выбора "правильного" метода.
Это мой текущий (уродливый) обходной путь:
Object value = ...;
Foo foo = new Foo();
if (value instanceof Goo) {
Goo gooValue = (Goo) value;
return foo.overloadedMethod(gooValue); // -> overloadedMethod(Goo)
} else {
return foo.overloadedMethod(value); // -> overloadedMethod(Object)
}
Есть ли лучший способ сделать это без изменения кода вFoo
(класс, содержащий перегруженный метод)?
2 ответа
Конечно, вы всегда можете использовать рефлексию, чтобы найти наиболее конкретную версию метода, который применяется, но это может стать очень быстрым.
Но если эти два вызова приводят к совершенно разному поведению, то Foo либо предназначен для использования в шаблоне посетителя (т.е. с двойной диспетчеризацией), либо он не работает.
Вы можете взглянуть на Java MultiMethod Framework. Это в значительной степени слой вокруг того, что вы предлагаете, но, по крайней мере, он абстрагирован в логический модуль, который не входит в ваши обязанности?
(Насколько я знаю, нет чистого способа сделать это, не прибегая к рефлексии / экземпляру взлома)