【问题标题】:Invoking a same method just once in java在java中只调用一次相同的方法
【发布时间】:2011-10-06 19:59:56
【问题描述】:

我有四个不同的类 classA、classB、classC 和 classD。所有四个类都有相同的静态方法 search(),它接受两个字符串参数。如果我想一次在主类的四个不同类中调用静态方法搜索。我怎样才能做到这一点。现在我的主类代码如下。我还需要对其他 3 个类执行相同的操作。我怎样才能做到这一点,并以与 classA 相同的方式显示其他 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");
    }
}

【问题讨论】:

  • 方法必须是静态的是否有特定原因?这似乎是一个很好的接口方法候选者。
  • 同意。 Strategy Pattern 是去这里的方式。

标签: java string search


【解决方案1】:

我强烈建议您将其更改为非静态方法。看看分离界面是多么简单和美好:

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));
}

【讨论】:

    【解决方案2】:

    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 和 try/catch 了吗?好吧,这是一个提示:告诉你这段代码至少是可疑的。它实际上是不安全的、性能不佳的,而且是一种愚蠢的解决方法。

    (但我们一生中都做过一次这样的事情)

    【讨论】:

      【解决方案3】:

      我真的不明白为什么有人会这样做。

      也就是说,您可以有一个方法以 Class 作为参数并通过名称显式调用该方法 (getMethod.../invoke())。

      这会让你回到非静态世界,你可以迭代你想要调用的类。 (但同样,为什么首先使用静态?)

      伪未经测试的代码:

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

      【讨论】:

        【解决方案4】:

        如果您想将所有结果组合在一起,只需将结果添加到您的列表中即可:

        List<Integer> results = ClassA.findAll(pattern, dataToSearch);
        results.addAll(ClassB.findAll(pattern, dataToSearch));
        // etc.
        

        【讨论】:

        • 如果找到pattern的第一个匹配,则将A类和B类的结果一起给出。然后如果找到其他匹配的模式,它会再次给出 A 类和 B 类的结果。有没有办法可以将A类的所有结果一起打印,然后是B类等等?
        • @Xyz Xyz,看看我的答案:它将为 A B C 和 D 调用 findAll ,所有匹配项都将放入最终结果列表。因此,在 for 循环之后,您将得到所有由 A、B、C 或 D 创建的整数
        猜你喜欢
        • 1970-01-01
        • 2011-09-06
        • 2019-09-24
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        相关资源
        最近更新 更多