循环与开关与不同的循环

Can*_*lon 2 java performance

我有一个循环用户元素的方法,并根据一些给定的约束设置一个布尔值:

public void checkUsers( int constraint ) {
    for(int i=0; i<nodeUsers().size(); i++) {
        UserElement elem = nodeUsers().getUsersElementAt(i);

        switch (constraint) {
          case CHECK_ALL:
              elem.setChecked(true); break;
          case CHECK_NONE:
               elem.setChecked(false); break;
          case CHECK_NO_LANG:
               if (elem.getLanguage() == null)
                   elem.setChecked(true);
               else
                   elem.setChecked(false);
               break;
          // More cases         
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道这个解决方案是否合适.也许我可以更好地编写不同的方法,如:

public void checkAllUsers() {
    for(int i=0; i<nodeUsers().size(); i++) {
        UserElement elem = nodeUsers().getUsersElementAt(i);
        elem.setChecked(true);  
    }
}

public void checkNoUsers() {
    for(int i=0; i<nodeUsers().size(); i++) {
        UserElement elem = nodeUsers().getUsersElementAt(i);
        elem.setChecked(false); 
    }
}
Run Code Online (Sandbox Code Playgroud)

//编辑:我添加了第三个案例.

Jon*_*eet 16

在我看来,你可以通过使你的约束成为一个真正的枚举来更有效地做到这一点:

public enum Constraint
{
    CHECK_NONE
    {
        @Override void apply(UserElement element)
        {
            element.setChecked(false);
        }
    },
    CHECK_ALL
    {
        @Override void apply(UserElement element)
        {
            element.setChecked(true);
        }
    };

    public abstract void apply(UserElement element);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以:

public void checkUsers(Constraint constraint) {
    for(int i=0; i<nodeUsers().size(); i++) {
        UserElement elem = nodeUsers().getUsersElementAt(i);
        constraint.apply(elem);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,使用具有相同"apply"方法的接口,并将接口的实例传入您的checkUsers方法.它是相同的基本模式 - 将所有用户元素的迭代与"如何处理元素"分开.