私は多くのクラスを持っており、それぞれが実装GeneralInterface
し、場合によっては追加の機能インターフェースを持っています:
interface GeneralInterface {}
class MyObjectTypeOne implements GeneralInterface { /*...*/}
class MyObjectTypeTwo implements GeneralInterface, InterOne { /*...*/}
class MyObjectTypeThr implements GeneralInterface, InterOne, InterTwo { /*...*/}
MyObjectTypeXXX
これらのインスタンスを保持するリストがあります
class ListHolder {
public static List<GeneralInterface> list = new ArrayList<>();
ListHolder() {
list.add(new MyObjectTypeOne());
list.add(new MyObjectTypeTwo());
list.add(new MyObjectTypeTwo());
// add any number of any of the types
}
}
および 20 ~ 40 の機能インターフェイス。以下に 2 つの例を示します。
@FunctionalInterface
public interface InterOne {
boolean onInterOne();
static void iterate() {
for (GeneralInterface obj : ListHolder.list) {
if (obj instanceof InterOne) {
if (((InterOne) obj).onInterOne())
System.out.println("yes");
}
}
}
}
と
@FunctionalInterface
public interface InterTwo {
boolean onInterOne(String string);
static void iterate(String string) {
for (GeneralInterface obj : ListHolder.list) {
if (obj instanceof InterTwo) {
if (((InterTwo) obj).onInterTwo(string))
System.out.println("yes");
}
}
}
}
iterate
コードのさまざまな場所で、さまざまなメソッドを呼び出す必要があります。
InterTwo.iterate("S");
InterOne.iterate();
私の問題はiterate
、オブジェクトがそのインターフェイスを実装しているかどうかを確認し(キャストして)、指定された引数で唯一の抽象メソッドを呼び出している間、すべての機能インターフェイスのメソッドを維持する必要があることです。
構文または設計によって、これを行うメソッドを 1 つだけ維持する方法はありますか? リフレクションを使用すると、これを行うには悪い方法があることを知っています(調査を行ったことを示すためだけに表示していますが、望んでいません):
static void iterate(Class<?> clazz, Object arg) {
for (GeneralInterface obj : ListHolder.list) {
if (clazz.isAssignableFrom(obj.getClass())) {
Method[] methods = clazz.getMethods();
Method functional;
for (Method m : methods) {
if (m.getModifiers() == Modifier.ABSTRACT) {
functional = m;
break;
}
}
if ((boolean) functional.invoke(obj, arg)) // cast arg or do some other trick
System.out.println("yes");
}
}
}