2008-11-06 81 views
8

使用它们一段时间后,我不禁感到,当使用匿名类时,你不得不跳过的箍环是不值得的。匿名类是一个坏主意吗?

到处都是final,无论代码如何使用内部类都更难读懂。

那么使用它们的优点是什么?我肯定错过了什么。

回答

13

优点是它是闭包的实现。它笨重,但这是目前我们在Java中最好的。换句话说,你不需要创建一个新类,只是为了保存某个你已经作为局部变量获得的状态。

我有an article comparing C# and Java closures,为什么他们在第一位有用,这可能会有所帮助。

+0

我的印象是Java的匿名内部类没有关闭它们的环境,但没有引用或示例来支持自己。 – hark 2008-11-06 16:30:36

1

我通常将匿名类限制为只有几行。比5更长的任何东西都会成为一个命名的类。

+0

或者至少是一个静态嵌套类 – 2008-11-06 16:49:41

4

需要为单一目的的接口的实现(以及一些功能的接口或代码,因为真快丑)... 就像在下面的例子中,当嗯,我通常只使用它:

this.addListener(new IListener(){ 
    public void listen() {...} 
}); 
1

我建议你this article,我觉得很有启发性。

你说最终关键字遍布全球,但对于本地类,您仍然必须传递封闭类的状态,这对于可读性来说也是不利的。

1

Anynomous类可能很有用。但是我经常看到的却没有用。许多匿名课程太大,降低了可读性。一些专家使用许多相同的匿名类。没有严格的规则时,它是使用匿名类好主意或没有,但有拇指规则:

  1. 庞大而复杂的类不应该是匿名的。

  2. 容器类的可读性必须得到保证。

  3. 干 - 不要重复自己。不要创建两个相同的匿名类。

  4. 如果你有很多不相同但相似的匿名类,那么你应该确定这些类可以重用的部分。尝试使用模板方法模式。

代码和软件的质量对减少冗余非常重要。 “复制和粘贴”是编程中的反模式,因为原始代码段可能包含错误。如果有人复制这段代码,然后他复制错误。十周后,其他人发现错误并修复它,但另一个错误仍在代码中,并且需要额外的十个星期才能找到并修复它。 W