javaはhashmap初期化時に初期値プロセス解析を付与する。


Javaの中のHashMapはよく使われるデータ構造で、一般的にはデータ辞書やHash検索のためのコンテナとして使われています。
一般的に私たちは初期化して初値を与えます。

HashMap<String, Object> map = new HashMap<>();
map.put("name", "yanggb"); 
map.put("lover", "huangq");
しかし、ある表現で初期化を行い、初期値の割り当てを行いたい場合があります。

HashMap<String, Object> map = new HashMap<>() {
  {
    put("name", "yanggb");
    put("lover", "huangq");
  }
};
ここでは、二重括弧「{}」を初期化して、コードを簡潔に読みやすくします。第1の括弧は、実際には匿名の内部クラス(Anonymous Inner Class)を定義し、第2の括弧は、実際にはインスタンス初期化ブロック(Instance Initializer Block)であり、このブロックは内部匿名クラス構造の時に実行される。このような書き方のメリットは明らかです。一目瞭然です。しかし、このような書き方は、このオブジェクトのシリアル化に失敗する可能性があります。
一つは、このような方法が匿名の内部クラスの声明方式であるため、引用には外部クラスの引用が含まれている。したがって、この集合をシリアル化すると、外部のクラスも知らず知らずのうちにシリアル化され、外部のクラスがSerializeインターフェースを実現していない場合、エラーが発生します。
第二に、上記の例では、HashMapからのサブクラスの継承を宣言していますが、いくつかのシリアル化方法は、例えばGsonを通じてjsonにシリアル化したり、xmlにシリアル化したりする場合、クラスライブラリに提供される方式では、HashsetやHashMapのサブクラスをシリアル化できなくなり、シリアル化に失敗してしまいます。解決策はHashMapオブジェクトに再初期化することです。これで正常に初期化できます。
なお、このような二重括弧を用いて初期化するシンタックスは、実行効率においては通常の初期化書き方よりもやや低い。
最後に、この二重括弧を用いて初期化するシンタックスは、ArayListやSetなどのセットにも適用される。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。