如何处理未使用的@Override 方法?
How to deal with unused @Override methods?
如你所知,在实现接口时,有些方法必须被覆盖。在我的例子中,我经常需要覆盖不需要的方法。结果,我的 classes 塞满了空的 @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) {}
在这个例子中,我想通过按键盘上的 "End" 键来关闭我的程序。一旦我实现了所需的 "KeyListener" 接口,我就必须覆盖方法 "keyReleased" 和 "keyTyped"。
但是,由于我不需要这两种方法,因此它们在我的 class.
中仍然是空的
示例注释:
当然,这3行代码问题不大。 "MouseListener" 接口的实现看起来完全不同,其中几乎两倍的数字必须被覆盖。
更不用说实现多个接口会是什么样子了。
问题:
- 通过空方法,整个代码给人一种不干净的印象。
- 将代码传递给第三方时出现任何混淆。
- 在许多地方,建议删除未使用的代码。在我的例子中,这些空的@Override 方法将不会被使用。 (例如 here)
清理这些空的 @Override 方法并使我的代码看起来更漂亮的最佳方法是什么 "clean"?
编辑
不要被我的例子搞糊涂了。问题本身是关于一般未使用的覆盖方法,而不是关于我的示例中的问题。对不起,如果我不清楚
有几种方法可以解决这个问题。
在我看来,首选方法是使用所有方法的默认实现创建一个抽象 class。无需实现您的接口,您可以扩展您的抽象 class 并仅覆盖您需要的方法:
鉴于您的界面:
interface FooBarBaz {
void foo();
int bar();
String baz();
}
您创建一个抽象 class 实现此接口并为所有方法提供默认实现:
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
}
}
然后您可以像这样在您的代码中使用它,并且只覆盖您需要的方法:
FooBarBaz fooBarBaz = new AbstractFooBarBaz() {
@Override
public int bar() {
return 9000;
}
};
另一种解决方案是在您的界面中使用默认方法。但这不是好的做法,因为接口应该定义行为,而不是实现。毕竟,如果它是第 3 方接口,您甚至可能无法做到这一点。
如你所知,在实现接口时,有些方法必须被覆盖。在我的例子中,我经常需要覆盖不需要的方法。结果,我的 classes 塞满了空的 @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) {}
在这个例子中,我想通过按键盘上的 "End" 键来关闭我的程序。一旦我实现了所需的 "KeyListener" 接口,我就必须覆盖方法 "keyReleased" 和 "keyTyped"。 但是,由于我不需要这两种方法,因此它们在我的 class.
中仍然是空的示例注释:
当然,这3行代码问题不大。 "MouseListener" 接口的实现看起来完全不同,其中几乎两倍的数字必须被覆盖。 更不用说实现多个接口会是什么样子了。
问题:
- 通过空方法,整个代码给人一种不干净的印象。
- 将代码传递给第三方时出现任何混淆。
- 在许多地方,建议删除未使用的代码。在我的例子中,这些空的@Override 方法将不会被使用。 (例如 here)
清理这些空的 @Override 方法并使我的代码看起来更漂亮的最佳方法是什么 "clean"?
编辑
不要被我的例子搞糊涂了。问题本身是关于一般未使用的覆盖方法,而不是关于我的示例中的问题。对不起,如果我不清楚
有几种方法可以解决这个问题。 在我看来,首选方法是使用所有方法的默认实现创建一个抽象 class。无需实现您的接口,您可以扩展您的抽象 class 并仅覆盖您需要的方法:
鉴于您的界面:
interface FooBarBaz {
void foo();
int bar();
String baz();
}
您创建一个抽象 class 实现此接口并为所有方法提供默认实现:
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
}
}
然后您可以像这样在您的代码中使用它,并且只覆盖您需要的方法:
FooBarBaz fooBarBaz = new AbstractFooBarBaz() {
@Override
public int bar() {
return 9000;
}
};
另一种解决方案是在您的界面中使用默认方法。但这不是好的做法,因为接口应该定义行为,而不是实现。毕竟,如果它是第 3 方接口,您甚至可能无法做到这一点。