2011-04-04 48 views
7

我刚刚通读了关于SCJP book中方法本地内部类的一章,我真的很想考虑它们的任何实际用途。Java中的方法本地内部类提供了什么好处?

我一直觉得这个方法应该尽可能的小和特定于他们的任务(Orthogonality IIRC),所以即使是最简单的内部类也会引入分叉和笨拙的方法。

任何人都可以为方法本地内部类提供一个很好的实际用法吗?到目前为止,我觉得我可能需要纯粹为了通过考试而理解它们,而不是用于日常编码。

Cheers

+0

它们通常用于实现回调方法。 – helpermethod 2011-04-04 19:48:08

+0

到目前为止,我只用了一次:我需要一个适当的键类用于方法中的临时HashMap。 – Landei 2011-04-04 21:23:01

+0

现实世界的方法的局部内部类的使用位置: http://stackoverflow.com/a/14900700/82609 – 2013-02-15 18:09:49

回答

11

在大多数情况下(例如,对于动作监听器,可运行参数等),您将使用匿名类而不是方法局部命名类。

但有一件事情是名为类可以做的和匿名类不能:实现多个接口,或者扩展一个类和接口了。此外,您可以创建此类的多个对象(不使用循环)。

+0

“另外,您可以创建此类的多个对象(不使用循环)。” - 你当然可以。即使在定义类的方法的多个调用中,该类仍然是相同的。 – 2011-04-08 10:24:44

1

本地类允许从父类中取出逻辑并将其对象化。这将功能从它不属于的地方移除,并将其放入它自己的类中。但是如果这个新对象只需要很短的时间,只需要一段代码的时间呢?那么,这就是本地课程适合的地方。

3

我想说更好的封装是好处。

2

当您尝试执行“功能”操作或将代码传递给稍后调用的另一个对象时,方法local内部类很有用。在大多数情况下,像这样的类只被调用或使用过一次,所以不需要在其他地方定义它,并迫使读者去寻找它。未来的Java版本可能会用“闭包”替代这些类型的内部类的大多数用例。

常见的情况是当您编写调用某个其他方法或启动新线程的事件侦听器时。

+0

对于使用匿名类的代替方法 - 本地命名类是更好的。 – Raedwald 2011-05-12 14:06:00

0

我觉得Runnable实现传递给主题:

Thread t = new Thread(new Runnable() { 
    void run() { 
     ... 
    } 
}); 

这是匿名类,任何匿名类是内为好。

+1

但runnable不是一个方法本地内部类(它是一个普通的匿名内部类) – Chii 2011-05-09 12:47:20