为调用创建方法数组

时间:2015-02-27 14:38:56

标签: java arrays

我必须在Java中创建一个方法数组,因为我必须在循环中调用方法,并且调用的方法取决于数字的值(例如,如果figure等于8,则它的assert8()等等...)我可以用一个简单的if else语句来做,但它不会干净。

所以我写了这个:

boolean assertionsArray[] = {assert0(), assert1(), assert2(), assert3(), assert4(),
                             assert5(), assert6(), assert7(), assert8(), assert9()};

现在我正在搜索如果我的数字是2,我会调用assertionsArray [2]等...

谢谢!

6 个答案:

答案 0 :(得分:1)

你所拥有的不是一系列方法,它是一个boolean的数组。在创建数组时调用每个方法,这十个方法的返回值将成为数组中的值。

如果您想创建一个可以调用的数组,请创建一个返回boolean方法的接口实现数组。您这样做的方式取决于Java的版本。在Java 8之前,您可以这样做:

interface Predicate {
    boolean test();
}
Predicate[] assertionsArray = new Predicate[] {
    new Predicate() {public boolean test() {return assert0(); }}
,   new Predicate() {public boolean test() {return assert1(); }}
,   new Predicate() {public boolean test() {return assert2(); }}
...
,   new Predicate() {public boolean test() {return assert9(); }}
};

现在你可以调用这样的断言:

if (assertionsArray[figureIndex].test()) {
    ...
}

从Java 8开始,您可以使用Java附带的谓词接口,并使用lambdas而不是匿名实现:

Predicate<Object>[] assertionsArray = new Predicate<Object>[] {
    o -> assert0(), o -> assert1(), o -> assert2(), o -> assert3(), 
,   o -> assert4(), ...
};
...
if (assertionsArray[figureIndex].test(null)) {
    ...
}

答案 1 :(得分:0)

撇开你不能在低于8的java版本中这样做,你会更好地调用一个可以处理各种输入的方法。

你提供了稀疏代码,所以我将在黑暗中拍摄并建议switch语句perharps。

答案 2 :(得分:0)

在数组创建时,您在此处执行的操作将生成一个boolean数组,其中包含所有assertX()方法的结果。

你在这里想要做的是让我想起C中的函数指针,在Java中不可能使用AFAIK。

考虑这个选择;

根据参数assertByIntArgument(int n)

,调用一个名为assertX()的方法调用相应的n方法

这样的事情:

private boolean assertByInt(int n){
  switch(n){
    case 1: return assert1(); break;
    case 2: return assert2(); break;
    // ...
  }
}

答案 3 :(得分:0)

这个答案更像是一个“感兴趣的问题”,而不是一个真正的解决方案。非Java 8环境中的最佳解决方案可能是switch。如下所示,另一个领导将是反思,但请注意:

  • 效率和效率都不高;
  • 它使您的IDE(和编译器)失明并在导航代码时阻碍您;
  • 过多的反射使代码无法读取。

使用风险自负。


如果您想坚持使用多种方法,可以使用反射。

如果您的方法在MyClass中声明,则调用no-arg方法如下:

MyClass.class.getDeclaredMethod("assert" + i).invoke();

如果您需要传递参数(让我们说intString),请更新以下内容:

MyClass.class.getDeclaredMethod("assert" + i, int.class, String.class).invoke(3, "Hello");

答案 4 :(得分:0)

如果你这样做:

assert0();

您将调用该方法,该方法的返回值进入布尔数组,这不是您想要的。 当你想调用数组中的方法时,你正在查看反射包,但这是非常非常不好的做法。我不打算提供示例代码,因为这对您没有帮助。

正如@Dragan指出的那样,你更善于使用switch语句,例如:

switch( figureNumber ) {
   case 0: assert0(); break;
   case 1: ... ; // etc
}

答案 5 :(得分:0)

使用Java 8,您可以拥有以下内容:

Supplier<Boolean> assertionsArray = {
    SomeClass::assert0(), 
    SomeOtherClass::assert1(), 
    SomeClass::assert2(), 
    SomeClass::assert3(), 
    SomeClass::assert4(),
    SomeClass::assert5(), 
    SomeClass::assert6(), 
    SomeClass::assert7(), 
    SomeClass::assert8(), 
    this::assert9()
};

然后,在循环或其他地方:

boolean result = assertionsArray[i].get();