Java中是否存在用于满足接口的空方法的习惯用法?

cam*_*dez 26 java oop annotations idioms interface

假设我有一个Foo实现接口的类,如MouseListener.该MouseListener接口由五个方法组成,但我只希望覆盖其中一个(mouseClicked()).是否有一种标准的,惯用的格式化其他方法的方法?

我倾向于写下以下内容:

@Override
public void mouseClicked(MouseEvent e) {
    // (...) <-- actual code here
}

@Override
public void mouseEntered(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

@Override
public void mouseExited(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

@Override
public void mousePressed(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

@Override
public void mouseReleased(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}
Run Code Online (Sandbox Code Playgroud)

我很擅长明确表示方法是故意空白而不是意外地留下来,但我并不是因为基本没有放弃所有垂直空间而疯狂.我也看过以下格式:

public void mouseClicked(MouseEvent e) {
    // (...) <-- actual code here
}

public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
Run Code Online (Sandbox Code Playgroud)

我对此一般都很好,我理解作者的意图,但是当添加(推荐)@Override注释时,它变得非常难看.

我不是一个特别有经验的Java编码器,所以我想我会问是否有一个约定.思考?

Jan*_*ann 9

我这样做的方式与你一样,如果没有什么东西留在一条线上.也许在一大块"实施单线"之上发表评论.


Dón*_*nal 8

在这种特殊情况下,您应该遵循wilums2的建议并扩展MouseAdapter而不是实现MouseListener.这些适配器类的目的是,当您仅实现接口的某些方法时,不必提供空实现.

更一般地说,简短的回答是"不",没有关于如何记录空方法的标准惯例,尽管我通常使用类似的东西

@Override
void foo() {
  // No implementation necessary
}
Run Code Online (Sandbox Code Playgroud)


use*_*884 5

使用MouseAdapter

  • 虽然这个答案是正确的,但它没有解决问题的精神,即当只实现部分接口时要做的事情. (7认同)
  • 他要求使用conevtions,而不是实现什么接口. (6认同)
  • MouseAdapter的源代码与任何代码一样好.但是,我认为这取决于方法.对于MouseListener,无需指示是否已提供实现.对于其他接口,可能适合抛出异常,而在其他接口中,仅记录该方法没有做任何事情可能是适当的. (2认同)

Sco*_*eld 5

一般来说,你所说的是Null对象模式的扩展.你正在定义一个Null对象并通过仅覆盖你关心的方法来扩展它.

作为自动化方法的一个示例,在我的JavaDude Bean Annotations(http://code.google.com/p/javadude/wiki/Annotations)中,您可以执行以下操作.[注意:我不建议为MouseListener执行此操作,因为MouseAdapter已经存在并且您可以将其子类化...以下对于您只想实现一些选择方法的其他大型接口非常有用]

@Bean(nullObjectImplementations = @NullObject(type=MouseListener.class))
public class MyMouseHandler extends MyMouseHandlerGen {
    public void mouseClicked(MouseEvent e) {
        // your handling of a MouseClick
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用MyMouseHandler来处理单击.=

注意:对于JRE/JDK中类的名称,MouseAdapter是一个非常糟糕的选择.它不是GoF适配器模式的实例; 它实际上是MouseListener的Null Object实现.

顺便说一句:您可以将@Override放在与方法声明相同的行上 - 对于您可以拥有的示例

@Override public void mousePressed(MouseEvent e) { /* not needed */ }
// et al
Run Code Online (Sandbox Code Playgroud)