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

What benefit do method-local inner classes provide in Java?

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

我一直有这样的印象:方法应该尽可能小,并且尽可能特定于它们的任务(正交性IIRC),所以即使引入最简单的内部类,也会创建出非常复杂的方法。

有人能为方法局部内部类推荐一个好的实用用法吗?到目前为止,我觉得我可能仅仅为了通过考试而理解它们,而不是为了在日常编码中使用它们。

干杯


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

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


我想说更好的封装是有益的。


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

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


本地类允许从父类中取出逻辑并将其对象化。这会从不属于它的地方删除功能,并将其放入自己的类中。但是,如果这个新对象只需要很短的时间,只需要一个代码块的持续时间,又该怎么办呢?好吧,这就是当地的阶级适合的地方。


很少使用局部类(方法局部内部类)。当一个方法中需要任何重复的功能时,如果我们不想创建类级方法(可能是因为这个功能我们可能不需要方法之外的功能),例如,假设我们的代码(任何部分)中重复需要sum&mul方法opus方法),一种创建类级方法并在需要时调用它们的方法,但是如果这些方法不再需要在这个方法之外,在这种情况下,我们可以考虑创建一个本地内部类并在需要时访问它的sum方法,只在这个方法内,下面的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Outer {
    public void calculations() {
        class Inner {
            public int sum(int x, int y) {
                System.out.println("sum :" + (x+y));
                return x+y;
            }
            public int mul(int x, int y) {
                System.out.println("multiplication :" + (x*y));
                return x*y;
            }
        }
        Inner i= new Inner();
//some code...
        i.sum(10, 20);
//some code...etc
        i.mul(30, 40);
        i.mul(14, 12);
        i.sum(10000, 20000);
//some other code...
    }
}
public class TestClass {
    public static void main(String[] args) {
        new Outer().calculations();
    }
}


我认为Runnable实现被传递到线程:

1
2
3
4
5
Thread t = new Thread(new Runnable() {
   void run() {
      ...
    }
});

这是匿名类,任何匿名类也是内部的。