如您所知,实现接口时必须重写某些方法。以我为例,经常会发生我不得不覆盖不需要的方法的情况。结果,我的类挤满了空的@Override方法。
示例:
@Override
public void keyPressed(KeyEvent ke) {
// TODO Auto-generated method stub
if(ke.getKeyCode() == KeyEvent.VK_END) {
System.exit(0);
}
}
@Override
public void keyReleased(KeyEvent arg0) {}
@Override
public void keyTyped(KeyEvent arg0) {}
在此示例中,我想通过按键盘上的“结束”键来关闭程序。一旦实现所需的“ KeyListener”接口,就必须覆盖方法“ keyReleased”和“ keyTyped”。 但是,由于我不需要这两个方法,因此它们在我的课程中仍然为空。
示例注释:
当然,这三行代码不是什么大问题。 “ MouseListener”接口的实现看上去将完全不同,其中几乎两倍的数字将必须被覆盖。 更不用说实现多个接口时的样子了。
问题:
清理这些空的@Override方法并使我的代码看起来更“干净”的最佳方法是什么?
修改
不要为我的例子感到困惑。问题本身通常是关于未使用的覆盖方法的,而不是我的示例中的问题。很抱歉,如果我不清楚
答案 0 :(得分:1)
有几种方法可以解决此问题。 我认为首选的方法是使用所有方法的默认实现创建一个抽象类。除了实现您的接口,您还可以扩展您的抽象类并仅覆盖所需的方法:
给出您的界面:
await
您创建实现此接口并为所有方法提供默认实现的抽象类:
interface FooBarBaz {
void foo();
int bar();
String baz();
}
然后您可以像这样在代码中使用它,并且仅覆盖所需的方法:
abstract class AbstractFooBarBaz implements FooBarBaz {
@Override
public void foo() {
// NOP by default
}
@Override
public int bar() {
return 0; // 0 by default
}
@Override
public String baz() {
return null; // null by default
}
}
另一种解决方案是在界面中使用默认方法。但是,这不是一种好的做法,因为接口应该定义行为,而不是实现。毕竟,如果它是第三方接口,您甚至可能无法做到这一点。