Java中定数Map、定数List

4122 ワード

Javaで宣言された定数はfinalキーワードで修飾されますが、finalは基本データ型にのみ有効です.たとえば、次のようにします.
public static final String content = "  ";
public static final int num = 1;

定数のListまたはMapが必要で,単純にfinalを用いて修飾すると,集合の内容の追加と修正には役に立たない.次のコードは、私たちの目的である「集合コンテンツの定量化」を達成することはできません.
    public static final Map myMap = new HashMap() {
        private static final long serialVersionUID = 1L;

        {
            put("1", "11");
            put("2", "22");
        }
    };

    public static final List myList = new ArrayList() {
        private static final long serialVersionUID = 1L;

        {
            add("a");
            add("b");
        }
    };

具体的な理由はJavaのメモリアドレスストレージを研究することに興味があります.以下では、問題を解決するための方法を直接示します.
    public static final Map myMap = Collections.unmodifiableMap(new HashMap() {
        private static final long serialVersionUID = 1L;

        {
            put("1", "11");
            put("2", "22");
        }
    });

    public static final List myList = Collections.unmodifiableList(new ArrayList() {
        private static final long serialVersionUID = 1L;

        {
            add("a");
            add("b");
        }
    });

もちろんリストにはもう一つの方法があります.
public static final List myList1 = new ArrayList(Arrays.asList("Tom", "Jerry", "Mike"));

最後に、上記のコードのfinalは、Map、Listコンテンツの修正に実際の役割を果たすことはできませんが、Stringのようなタイプと同様に、mapへの直接的な付与を禁止することができます.final修飾後,我々の集合を初期化した後,直接オブジェクト付与を行い,myMap = new HashMap();のようにコンパイルできない.したがって,目的を達成するためには,オブジェクトが「直接付与」によって修正されることを禁止するとともに,集合内容の変更も禁止する.