检查多个状态属性的更顺畅的方法

时间:2017-07-24 12:48:14

标签: java if-statement

我最近对某些事情感到沮丧,我认为应该采用更顺畅的方式,但我无法找到。

在我的一种方法中,我必须检查ActionEvent e的确切来源。由于我有多个按钮,应该在点击时调用相同的方法,我检查了它们:

if (e.getSource() == btn1 || e.getSource() == btn2 || e.getSource() == btn3)

对我来说这看起来不太好,因为我必须为每个按钮调用e.getSource()。我认为应该有类似的东西:

if(e.getSource() == btn1 || btn2 || btn3)

我知道这不起作用,但我希望你能得到我想要实现的概念。如果它是重复的,我很抱歉,但我无法找到它。如果它根本不可能,那么我将不得不忍受它。

3 个答案:

答案 0 :(得分:2)

您可以使用可变参数隐藏冗长的代码。

public boolean checkSource( Object source, Object... buttons){
   for( Object btn: buttons)
       if( source == btn )
           return true;
}

然后你必须列出按钮:

checkSource( e.getSource(), btn1, btn2, btn3, ... );

或者,使用 lambdas 谓词界面:

Predicate<Object> p1 = ( btn  -> btn == e.getSource() );
...
if( p1.test( btn1 ) || p1.test( btn2 ) || p1.test( btn3 ) || ...)

答案 1 :(得分:1)

有多种方法可以解决此问题。 如果状态btn1btn2btn3表示可以在逻辑上一起表示的某个概念,则可以创建这些状态的Set。 然后在你的if条件下,你只需要:

//somewhere in your code
private final Set<YourType> buttons = new HashSet<>(btn1,btn2,btn3);


//and here is how you would use it
if(buttons.contains(e.getSource())) {
  //do something here 
} 

以正确的方式命名此集合也很重要,以便显示它们所代表的概念,将它们组合在一起。

答案 2 :(得分:0)

您可以使用switch语句。

switch (e.getSource()) {
    case btn1:
        // Do stuff for button 1 here
        break;
    case btn2:
        // Do stuff for button 2 here
        break;
    case btn3:
        // Do stuff for button 3 here
        break;
    default:
        // Do stuff for all other buttons here
}

如果你想为所有3个按钮做同样的事情:

switch (e.getSource()) {
        case btn1:
            // Don't break
        case btn2:
            // Don't break
        case btn3:
            // Do stuff for buttons 1 2 and 3
            break;
        default:
            // Do stuff for all other buttons here
    }