如何处理未使用的@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" 接口的实现看起来完全不同,其中几乎两倍的数字必须被覆盖。 更不用说实现多个接口会是什么样子了。

问题:

  1. 通过空方法,整个代码给人一种不干净的印象。
  2. 将代码传递给第三方时出现任何混淆。
  3. 在许多地方,建议删除未使用的代码。在我的例子中,这些空的@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 方接口,您甚至可能无法做到这一点。