在 Java 中的方法中使用类定义

2022-08-31 08:59:16

例:

public class TestClass {

    public static void main(String[] args) {
        TestClass t = new TestClass();
    }

    private static void testMethod() {
        abstract class TestMethod {
            int a;
            int b;
            int c;

            abstract void implementMe();
        }

        class DummyClass extends TestMethod {
            void implementMe() {}
        }

        DummyClass dummy = new DummyClass();
    }
}

我发现上面的代码在Java中是完全合法的。我有以下问题。

  1. 在方法中拥有类定义有什么用?
  2. 将生成类文件DummyClass
  3. 我很难以面向对象的方式想象这个概念。在行为中具有类定义。也许有人可以用等效的真实世界的例子告诉我。
  4. 方法中的抽象类对我来说听起来有点疯狂。但不允许使用接口。这背后有什么原因吗?

答案 1

这称为本地类。

2很简单:是的,将生成一个类文件。

1和3是同一个问题。您将使用一个本地类,在该类中,除了在一个方法中之外,您永远不需要在任何地方实例化一个或了解实现细节。

典型的用法是创建某些接口的一次性实现。例如,您经常会看到如下内容:

  //within some method
  taskExecutor.execute( new Runnable() {
       public void run() {
            classWithMethodToFire.doSomething( parameter );
       }
  }); 

如果您需要创建一堆这些并用它们执行某些操作,则可以将其更改为

  //within some method
  class myFirstRunnableClass implements Runnable {
       public void run() {
            classWithMethodToFire.doSomething( parameter );
       }
  }
  class mySecondRunnableClass implements Runnable {
       public void run() {
            classWithMethodToFire.doSomethingElse( parameter );
       }
  }
  taskExecutor.execute(new myFirstRunnableClass());
  taskExecutor.execute(new mySecondRunnableClass());

关于接口:我不确定是否存在使本地定义的接口成为编译器问题的技术问题,但即使没有,它们也不会增加任何价值。如果在方法外部使用实现本地接口的本地类,则该接口将毫无意义。如果一个本地类只在方法内部使用,那么接口和类都将在该方法中实现,因此接口定义将是多余的。


答案 2

这些称为局部类。您可以在此处找到详细的解释和示例。该示例返回一个特定的实现,我们不需要在方法之外了解该实现。