我必须在Java中创建一个方法数组,因为我必须在循环中调用方法,并且调用的方法取决于数字的值(例如,如果figure等于8,则它的assert8()等等...)我可以用一个简单的if else语句来做,但它不会干净。
所以我写了这个:
boolean assertionsArray[] = {assert0(), assert1(), assert2(), assert3(), assert4(),
assert5(), assert6(), assert7(), assert8(), assert9()};
现在我正在搜索如果我的数字是2,我会调用assertionsArray [2]等...
谢谢!
答案 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
。如下所示,另一个领导将是反思,但请注意:
使用风险自负。
如果您想坚持使用多种方法,可以使用反射。
如果您的方法在MyClass
中声明,则调用no-arg方法如下:
MyClass.class.getDeclaredMethod("assert" + i).invoke();
如果您需要传递参数(让我们说int
和String
),请更新以下内容:
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();