0

私は多くのクラスを持っており、それぞれが実装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");
        }
    }
}
4

1 に答える 1

0

あなたのコードには改善が必要な点がいくつかあると思いますが、特定の問題に対する応答を提供することにのみ焦点を当てました。その共通メソッドを中間抽象クラスに渡す必要があると思います。

abstract class MyObjectTypeAbstract {
   abstract boolean onInter(String ... testString);
   abstract boolean onInter();
   void iterate(String string) {

       for (GeneralInterface obj : ListHolder.list) {
           if (obj instanceof InterTwo) {
               if (onInter(testString))
                   System.out.println("yes");
           }
       }
   }
   void iterate() {

       for (GeneralInterface obj : ListHolder.list) {
           if (obj instanceof InterTwo) {
               if (onInter())
                   System.out.println("yes");
           }
       }
   }
}

これが行うことは、提供したすべてのFunctionalInterfaceで異なると思われる唯一のものを実装させることです。それがonInterメソッドです。それは違うようです。だから私はこの要約を作りました。残りは共有されます。また、反復メソッドから静的を取り出して、onInter メソッドのさまざまな実装にアクセスできるようにしました。うまくいけば、これを静的にする必要はありません。したがって、私が提示する解決策は、クラスでこの抽象クラスを拡張し、今のようにインターフェイスを実装することです。

于 2016-05-14T21:36:23.893 に答える