采用以下示例。有一个我想要使用的对象,称之为Doodad
。 Doodad
元素对浏览器事件的处理实施不当。 Doodad
的典型实例化将是Doodad someDoodad = new Doodad();
。显然,由于事件处理不当,这不符合我的需要。我是否适合覆盖onBrowserEvent()
方法,如下所示:
Doodad someDoodad = new Doodad() {
@Override
public void onBrowserEvent(Event event) {
switch (DOM.eventGetType(event)) {
case Event.ONDBLCLICK:
case Event.ONFOCUS:
case Event.ONCLICK:
if (!isEnabled()) {
return;
}
break;
}
super.onBrowserEvent(event);
}
};
显然这是一个简单的例子,但是当我不想要使用匿名内部类时?是明确禁止还是不可能?
我看到第一个问题的答案很多,但到目前为止,答案都没有回答第二个问题:是否明确禁止或不可能使用匿名内部类?
答案 0 :(得分:6)
通常,匿名内部类的最佳用法是,您只想创建此类的特定实现的一个实例。当实现非常简单时。理想情况下,它应该包含1-2行代码。
在你的情况下,虽然你的方法onBrowserEvent()
长于2行,但仍然可以。
答案 1 :(得分:3)
匿名内部类是Java用于创建闭包的语法。这是一个近似的例子:
interface Adder {
int add(int arg);
}
...
Adder createAdder(int n) {
final int nf = n;
return new Adder() {
int add(int arg) { return arg + nf; }
}
}
方法createAdder创建本质上是一个函数,使用闭包来捕获传递的值n。闭包在函数式编程中很重要,它正试图使其成为主流。这就是为什么每个人都在尖叫我们需要Java中的“真正”闭包(即大多数语法比我的例子更好)。
(当然我没有回答问题;我想我所说的是匿名类对我上面描述的内容有好处。几乎所有其他我都会创建一个命名内部类,因为如果有什么名字是自我记录,在我看来更容易阅读)
答案 2 :(得分:1)
通常,事件监听器是一段不是非常通用的代码,但它与特定的小部件,按钮,文本字段等无关。在这种情况下,代码不需要被适当地公开以供世界重用它。更容易定义它的使用位置,这就是匿名内部类的用途。它们允许在另一个方法中快速嵌入代码片段,而不必担心类名,包,可见性或可重用性。
当然,您可以使用适当的独立类来完成匿名内部类的操作。但是当你的事件处理类足够通用(可以处理大量事件),可重用,有状态,或者更通常地从代码中提取事件管理代码时有一些好处时,这样做更有意义。定义事件生成元素。
我不确定我是否明白您的问题,我希望这条信息可以帮助您找到答案。不要犹豫,提出进一步的问题。
答案 3 :(得分:1)
我会建议匿名类在实现一个方法时和/或半个屏幕已满。
如果匿名者有非繁琐的代码,那就值得拥有一个命名类恕我直言。
答案 4 :(得分:0)
我的看法:
匿名内部类:从一个函数回调(所以你不要写两次代码)
命名的内部类:来自多个函数的回调(或者只需要父类的内部逻辑的类)
答案 5 :(得分:0)
当它包含非常少量的代码时,我只使用匿名内部类。理由是IMO它使代码混乱并使其可读性降低。
如果需要更多代码,我更喜欢创建一个新类,扩展基类(在本例中为'Doodad()'
答案 6 :(得分:0)
在您的示例中,您可能希望创建一个单独的类。这是因为你重写方法的原因。也就是说,浏览器事件的处理能力很差。
具体来说,您可能希望在几个不同的地方创建这些改进的Doodads。如果事件处理在未来更新和改进会发生什么?您将要删除所有这些改进的Doodads并使用正确的实现。试图找到你所有的匿名Doodads可能是令人厌倦或棘手的。如果你有一个单独的命名类,那么重构这个类将很容易。
另外,如果你为它创建一个单独的类,你改进Doodad的原因可以是自我记录。然而,如果你只有一个匿名课程,那么你将不得不写评论或让未来的维护者猜测你为什么做了你已经完成的事情。
例如
public class ImprovedBrowserEventHandlingDoodad extends Doodad {
...
}
任何类似于闭包的东西通常都是使用匿名类的好选择
例如
new Thread(new Runnable() {
@Override
public void run() {
doSomething();
}
}).start();
您只想在这一组特定环境中执行某些操作,并且无需将代码复制并粘贴到其他位置或将其重构为方法。
GUI的事件处理程序在使用匿名类时是典型的,因为它们的使用仅限于GUI的设计方式,并且不需要在使用它的特定组件之外创建事件处理程序的单独实例。例如,当您将鼠标悬停在滚动条上时,其外观通常会发生变化。程序中的任何其他内容都不会导致此更改,通常事件处理程序将有几行告诉滚动条更改其外观,例如。 scrollbar.setMouseOverEffect(true);
。