新对象 { } 构造

2022-09-01 15:26:22

在Java中,创建对象的标准方法是使用

MyClass name = new MyClass();

我也经常看到结构

new MyClass() { /*stuff goes in here*/ };

我已经在网上找了一段时间,找不到关于第二种构造样式的作用或它是如何做到的很好的解释。

有人可以解释一下你如何以及为什么会使用第二个结构吗?


答案 1

这个构造实际上做了两件事:1)它声明一个匿名类,该类扩展了您在构造函数中使用的类,2)创建此匿名类的实例。

编辑:使用这样的结构时,您可以通过查看生成的文件来观察匿名类。每个匿名子类都有一个普通文件和另一个文件:第一个,依此类推。.classMyClass.classMyClass$1.class


答案 2

在要创建匿名类的情况下,可以使用第二个构造。如果您有一个将回调作为参数的方法,则可能需要指定内联回调的实现,而不是为其命名并将其放在单独的文件中,或者在同一文件中的其他位置声明它。

还有一个称为双大括号初始化的技巧,您可以使用匿名类来解决没有文字映射和列表语法的问题,如下所示:

Map map = new HashMap() {{put("foo", 1); put("bar", 2);}};

此处的嵌套大括号创建一个实例初始值设定项。绑定到映射的对象不是 HashMap,它的类是扩展 HashMap 的匿名类。(这意味着如果你有一个关于需要声明串行uids的类的PMD规则,那么它会抱怨这一点。