我最近对某些事情感到沮丧,我认为应该采用更顺畅的方式,但我无法找到。
在我的一种方法中,我必须检查ActionEvent e
的确切来源。由于我有多个按钮,应该在点击时调用相同的方法,我检查了它们:
if (e.getSource() == btn1 || e.getSource() == btn2 || e.getSource() == btn3)
对我来说这看起来不太好,因为我必须为每个按钮调用e.getSource()
。我认为应该有类似的东西:
if(e.getSource() == btn1 || btn2 || btn3)
我知道这不起作用,但我希望你能得到我想要实现的概念。如果它是重复的,我很抱歉,但我无法找到它。如果它根本不可能,那么我将不得不忍受它。
答案 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)
有多种方法可以解决此问题。
如果状态btn1
,btn2
和btn3
表示可以在逻辑上一起表示的某个概念,则可以创建这些状态的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
}