Java中的块语句

Java中的块语句,java,block,Java,Block,我有一个扩展java.util.HashMap的类MyMap,下面的代码作为一个语句块工作,但我不理解额外大括号的用法 MyMap m = new MyMap() { { put("some key", "some value"); } }; 现在为什么我需要额外的花括号,我不能这样做(但这会引发编译错误) 这: 创建一个,它是HashMap的子类 这: 这是一个很好的例子。在创建匿名子类的实例时执行代码。您在这里实际做的是定义MyMap的任意子类,这可能不是您的意图。。。

我有一个扩展java.util.HashMap的类MyMap,下面的代码作为一个语句块工作,但我不理解额外大括号的用法

MyMap m = new MyMap() {
  {
      put("some key", "some value");
  }
};
现在为什么我需要额外的花括号,我不能这样做(但这会引发编译错误)

这:

创建一个,它是
HashMap
的子类

这:


这是一个很好的例子。在创建匿名子类的实例时执行代码。

您在这里实际做的是定义MyMap的任意子类,这可能不是您的意图。。。最外面的大括号围绕着类内容。在Java中,不能将指令直接放在类块中:如果需要在实例化类时执行代码,可以将其放入构造函数中。这就是最里面的大括号的作用:它们为匿名类定义了一个初始值设定项

现在,你可能想要这样的东西:

MyMap m = new MyMap();
m.put("some key", "some value");

只需创建一个
MyMap
实例并调用
put
,不涉及匿名类。

它被称为“双括号初始化”。现在,您有了新的搜索关键字。相关:,而且这是一个肮脏的黑客行为,在我看来应该被禁止,在它后面加上一个初始值设定项(只需要一个
,并在所有这些方法前面加上var的名称,也许在它后面加上一个
static
),这样做不会创建一个匿名子类,“这可能不是你的本意”。。。实际上,有些人认为这种结构是惯用的。不过对我来说似乎有些过分了。
MyMap m = new MyMap() {
    ....
};
{
    put("some key", "some value");
}
MyMap m = new MyMap();
m.put("some key", "some value");