新对象 { } 构造

新手上路,请多包涵

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

MyClass name = new MyClass();

我也经常看到构造

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

我在网上找了一段时间,但找不到对第二种构造样式的作用或作用的很好的解释。

有人可以解释一下您将如何以及为什么使用第二个构造吗?

原文由 andrewheins 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 309
2 个回答

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

编辑:使用此类构造时,您可以通过查看生成的 .class 文件来观察匿名类。有正常的 MyClass.class 文件和每个匿名子类的另一个文件: MyClass$1.class 第一个等等。

原文由 ZeissS 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您想创建一个匿名类,您将使用第二个构造。如果您有一个将回调作为参数的方法,您可能希望内联指定回调的实现,而不是给它一个名称并将其放在单独的文件中或在同一文件的其他地方声明它。

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

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

这里嵌套的大括号创建了一个实例初始化器。 map绑定的对象不是HashMap,它的类是扩展HashMap的匿名类。 (这意味着如果你有一个关于需要声明串行 uid 的类的 PMD 规则,那么它会抱怨这个。)

双括号初始化是一个有趣的技巧,但不要在实际代码中使用它。传递像这样创建的地图是不安全的,因为内部对象保留对外部实例的引用,因此如果程序中的任何内容持有对地图的引用,它会阻止外部对象被垃圾收集。序列化也有问题。

原文由 Nathan Hughes 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题