在运行时确定 IF 语句条件

Determine IF statement condition at runtime

我有一个接受两个参数的函数,foo(A a, String type) 根据类型我必须更改 if 语句条件。

foo(A a, String type){
    //if type equals 'bar'
    if(!a.isEmpty() && a.hasMember()){...}
    //but if type is something else
    if(!a.isEmpty() || a.hasMember()){...}
}

if 正文中的逻辑几乎相同,除了条件是否有任何有效的方法来实现差异或者我必须将所有内容都写两次?

我想你可以使用以下内容:

foo(A a, String type){
    //if type equals 'bar'
    if("bar".equals(type)) {
       if(!a.isEmpty() && a.hasMember()){...}
    }
    else  {
      //but if type is something else
      if(!a.isEmpty() || a.hasMember()){...}
    }
}

说明:如果类型具有值 "bar",则如果条件变为真,则将执行该条件所需的任何代码。

你也可以使用简洁的形式:

if( ("bar".equals(type) && (!a.isEmpty() && a.hasMember())) || (!"bar".equals(type) && (!a.isEmpty() || a.hasMember()))) {
  // Do your stuff  
}

需要注意的一点是 "bar".equals(type)type.equals("bar") 更好,因为当类型为 null.

时,它也可以让您免于麻烦

将谓词与 || 组合,并在每个条件部分检查 type

if (type.equals("bar") && !a.isEmpty() && a.hasMember()) || (!type.equals("bar") && (!a.isEmpty() || a.hasMember())) {
  //do your thing
}

如果 nulltype 的可能值,则可以将检查更改为 "bar".equals(type) 以避免 NullPointerException.

你可以使用键类型的映射,值应该是你键入相关逻辑的对象。

foo(A a, String type) {
    typesMap.get(type).execute(a);
}


class TaskImpl implements Task { // each task should behave as it should be
    @override
    public void execute(A a) {
        if(!a.isEmpty() && a.hasMember()) {...}
    }
}