Вызов одного и того же метода только один раз в Java - PullRequest
2 голосов
/ 06 октября 2011

У меня есть четыре разных класса classA, classB, classC и classD. Все четыре класса имеют одинаковый статический метод search (), который принимает два строковых параметра. Если я хочу вызвать статический метод поиска в четырех разных классах из основного класса одновременно. Как мне это сделать. На данный момент мой код выглядит следующим образом для основного класса. Мне нужно выполнить то же самое для других 3 классов. Как я могу сделать это и отображать результаты других 3 так же, как для класса А. Способ поиска выполняется в 4 классах, но они должны давать одинаковый результат.

Main() {

    Object[] zy;

    for (String pattern : Read.arrayList) {
        List<Integer> results = ClassA.findAll(pattern, dataToSearch);
        zy = results.toArray();
        for (int i = 0; i < zy.length; i++) {
            System.out.println(" Pattern searched " + pattern + " match is found at index : "+ results);
        }
    }
    if (zy.length == 0) {
        System.out.println("Nothing matched");
    }
}

Ответы [ 4 ]

2 голосов
/ 07 октября 2011

Я настоятельно рекомендую вам изменить это на нестатические методы. Посмотрите, как легко и приятно, когда вы отделите интерфейс:

public interface Common {
    List<Integer> findAll(String pattern, String dataToSearch);
}

public class A implements Common ...
public class B implements Common ...
public class C implements Common ...
public class D implements Common ...

// in main:
List<Common> allYourClasses = new ArrayList<Common>();
allYourClasses.add(new A());
allYourClasses.add(new B());
allYourClasses.add(new C());
allYourClasses.add(new D());

List<Integer> result = new ArrayList<Integer>();
for (Common c : allYourClasses) {
    result.addAll(c.findAll(pattern, dataToSearch));
}
1 голос
/ 07 октября 2011

1 - Вы НЕ должны этого делать.Избегайте статических методов.Одна из причин в том, что их нельзя назвать без точного класса.Группа классов, которые реализуют простые интерфейсы, будут работать быстрее, безопаснее и лучше во всех отношениях

2 - Вы можете (но не должны) делать что-то вроде этого:

    for (Class<?> clazz : new Class[] { ClassA.class, ClassB.class,
            ClassC.class }) {

        Object[] zy = null;
        String dataToSearch = "";
        String[] arrayList = { "a" };
        for (String pattern : arrayList) {

            List<Integer> results = findAllForClass(clazz, pattern,
                    dataToSearch);
            zy = results.toArray();
            for (int i = 0; i < zy.length; i++) {
                System.out.println(" Pattern searched " + pattern
                        + " match is found at index : " + results);
            }
        }
        if (zy.length == 0) {
            System.out.println("Nothing matched");
        }
    }

@SuppressWarnings("unchecked")
public static List<Integer> findAllForClass(Class<?> clazz, String pattern,
        String dataToSearch) {
    List<Integer> list = null;
    try {
        list = (List<Integer>) clazz.getDeclaredMethod("findAll", String.class,
                String.class).invoke(null, pattern, dataToSearch);
    } catch (Exception e) {
        list = Collections.emptyList();
    }
    return list;
}

Вы видите @supresswarning и попробовать / поймать?ну, это подсказка: говорит вам, что этот код, по крайней мере, подозрительно.Это на самом деле небезопасно, неэффективно, и это глупый обходной путь.

(Но мы все сделали что-то подобное однажды в нашей жизни)

0 голосов
/ 07 октября 2011

Если вы хотите сгруппировать все результаты вместе, просто продолжайте добавлять результаты в свой список:

List<Integer> results = ClassA.findAll(pattern, dataToSearch);
results.addAll(ClassB.findAll(pattern, dataToSearch));
// etc.
0 голосов
/ 07 октября 2011

Я не могу понять, зачем кому-то это делать.

Тем не менее, вы могли бы иметь метод, принимающий класс в качестве параметра и вызывающий метод явно по имени (getMethod ... / invoke ()).

Это возвращает вас в нестатический мир, и вы можете перебирать классы, которые хотите вызвать. (Но опять же, зачем вообще использовать статику?)

Псевдо непроверенный код:

public void invokeStatic(Class clazz, String method, Class<?> paramsTypes[], Object[] params) {
    Method method = clazz.getMethod(method, paramsType);
    method.invoke(params);
}
...