2009-05-19 62 views
23

比方说,我有一个类Foo实现了一个接口,如MouseListener。接口由五个方法组成,但我只希望覆盖其中的一个(mouseClicked())。有没有一种标准的,惯用的方式来格式化其他方法?在Java中有没有一种习惯用于满足接口的空方法?

我的倾向是写:

@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. 
} 

我摆明是方法是有意空白,而不是不小心留下左右的球迷,但我不是疯了所有的垂直空间基本上什么都不放过。我也看到了以下格式:

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) {} 

我一般用这个确定,我理解作者的意图,但增加了(recommended@Override注释时,它变得非常难看。

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

+1

您知道MouseAdapter类,对不对? http://java.sun.com/javase/6/docs/api/java/awt/event/MouseAdapter.html – 2009-05-19 18:23:20

回答

5

使用MouseAdapter

+7

虽然这个答案是正确的,但它并没有解决问题的精神,即什么是要做的当只有部分接口正在实施时。 – 2009-05-19 18:24:31

+6

他要求提供策略,而不是实现什么接口。 – 2009-05-19 18:25:05

+0

扩展此类以创建MouseEvent侦听器并覆盖感兴趣事件的方法。 (如果你实现了MouseListener接口,你必须定义它的所有方法,这个抽象类为它们全部定义了空方法,所以你只需要为你关心的事件定义方法。)http:// java。 sun.com/j2se/1.4.2/docs/api/java/awt/event/MouseAdapter.html – 2009-05-19 18:26:54

8

我这样做,你做同样的方式,如果那里有什么也没有留下的一条线。也许会在一大块“实施一线”上发表评论。

1

MouseAdapter非常适合这种特殊情况,适配器习惯用法很好。适配器具有接口所有方法的空白实现,允许您继承和实现与您的类相关的那些方法。正如Andrew Hare所建议的,Adapter也可以抛出NotImplementedException异常。

6

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

更一般地,简单的答案是“不”,对如何记录空方法没有标准的惯例,不过我一般使用类似

@Override 
void foo() { 
    // No implementation necessary 
} 
1

监听器的目的是通知的一些事件。如果侦听器接口包含的方法回调比您需要的多,那么请忽略那些您不关心的回调。在你的情况MouseAdapter是专门为此目的而设计的。做不是 throw UnsupportedOperationException因为调用者很可能不会期待这个例外。它也很可能违反了监听器接口的合同,因为每种方法都有望实施。

0

我想我会形容它为“无操作实现”或可能使用术语“适配器”。正如其他人所指出的,Java提供了一个MouseAdapter类,它可以完成你想要的任务。严格地说,它并没有完全落入适配器模式的定义中,它将一个API转换为另一个,但坦率地说,我倾向于将这些事情命名为实用。

可能最重要的事情是清楚你打算让这个方法没有实现。在MouseAdapter的特定情况下,您可能不想投掷UnsupportedOperationException,但总的来说,这可能是一个很好的信号,表示您不打算提供实施。在源代码(或更好的方法文档)中解释为什么你没有完全实现接口通常是必要的。

0

我不认为这特别重要。对于我个人的口味,我不喜欢在开幕式旁边看到大括号,它给出:

public void mouseEntered(MouseEvent e) { 
} 

有点空,但没关系。在返回值的情况下,我们可以使它看起来一致,至于你没有使用[]风格。

但是,当涉及到环极少数情况下,我喜欢有一个分号:

// Made up example. 
while (++i < len && str.charAt(i) != '\0') { 
    ; 
} 

这将使:

public void mouseEntered(MouseEvent e) { 
    ; 
} 

catch条款的情况下,你会在评论中最好有一个很好的借口(可能会打断一个中断)。

5

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

作为一种自动执行此操作的示例,在我的JavaDude Bean注释(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 
    } 
} 

然后可以使用MyMouseHandler处理click =

注:MouseAdapter是在JRE/JDK类的名字还真不错的选择。它不是GoF适配器模式的一个实例;它实际上是一个MouseListener的空对象实现。

BTW:你可以把@覆盖在同一行的方法声明 - 为您例如,你可以有

@Override public void mousePressed(MouseEvent e) { /* not needed */ } 
// et al 
0

我发现这一点的同时寻找这个确切的问题。我正在使用滚动,我需要onScrollStateChanged但不是onScroll。我倾向于:

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
      int totalItemCount) { 
    return;   
} 

但是,我喜欢你给的第二个例子(在同一行上有大括号)。它结构紧凑,干净,可以始终如一地表达它故意留空的想法。

编辑:这是我看中了:

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
      int totalItemCount) {return;} 

这其中有很多的参数,所以它看起来并不像你一样在同一行,但你的想法。

2

有几种方法可以做到这一点。 Oracle java conventions p6。4(第11页)说,空的方法应该看起来像

public void empty() {} 

还有通过Steve Yohanan写于2003年的蚂蚁一个文件,它说

public void empty() 
{ 
} 

虽然我还没有找到“空的任何公约方法作为接口存根“。因此,作为结论,没有标准化的方式来做到这一点。 有些人更喜欢留言,有些人更喜欢将其作为单行,有些人则将其写为任何其他空白主体的方法。