方法本地内部类在Java中提供了什么好处?

时间:2011-04-04 19:39:21

标签: java inner-classes scjp

我刚刚阅读了SCJP book中关于方法本地内部类的章节,我真的很难想到它们的任何实际用途。

我一直都有这样的印象,即方法应该尽可能小而且特定于他们的任务(Orthogonality IIRC),所以即使是最简单的内部类也会创建一些重要且难以处理的方法。

有人能为方法本地内部类建议一个很好的实际用法吗?到目前为止,感觉好像我可能必须完全理解它们才能通过考试,而不是用于日常编码。

干杯

6 个答案:

答案 0 :(得分:11)

在大多数情况下(例如对于动作侦听器,runnable等),您将使用匿名类而不是方法本地命名类。

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

答案 1 :(得分:3)

我认为更好的封装是有益的。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

本地类允许从父类中取出逻辑并将其客观化。这将从不属于的地方删除功能并将其放入自己的类中。但是,如果这个新对象仅在短时间内需要,仅在单个代码块的持续时间内怎么办?嗯,这就是本地班级适合的地方。

答案 4 :(得分:0)

我认为传递给Thread的Runnable实现:

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

这是一个匿名类,任何匿名类都是内部的。

答案 5 :(得分:0)

很少使用局部类(方法局部内部类)。例如,当方法内部需要任何重复的功能并且如果我们对创建类级方法不感兴趣(可能是因为我们可能不需要在方法外部使用此功能)时,此方法很有用,假设假设sum和mul方法被重复要求在我们的代码(任何特定方法)中,一种创建类级别方法并在需要时调用它们的方法,但是如果这些方法在此方法之外不再需要该怎么办,在这种情况下,我们可能会考虑创建本地内部类并访问其内部类sum方法仅在该方法中需要时才使用,例如下面的示例

Value Name (\S*)
Value Valid_from (\S*)
Value Valid_to (\S*)

Start
  ^\tName:        ${Name}
  ^\tValid from:  ${Valid_from}
  ^\tValid to:    ${Valid_to}