私たちが知っているように、Javaの「最終」キーワードの目的は。変数をfinalとして宣言しながら、変数を初期化する必要があります。 「final int a = 10;」のように、「a」の値を変更することはできません。しかし、HashTableを使用する場合、HashTableをfinalとして宣言することで値を追加することもできます。
例::
private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>()
{{ put("foo", 1);
put("bar", 256);
put("data", 3);
put("moredata", 27);
put("hello", 32);
put("world", 65536); }};
今、最終的にMYHASH HashTableを宣言しています。これにさらに要素を追加しようとすると、受け入れられます。
MYHASH.put("NEW DATA", 256);
これで、「新しいデータ」がHashTableに追加されます。私の質問は、なぜその宣言を最終として追加することができるのですか????
Finalはオブジェクトではなく参照をマークするためです。その参照ポイントを別のハッシュテーブルに作成することはできません。ただし、オブジェクトの追加や削除など、そのオブジェクトに対しては何でもできます。
int
の例は、参照ではなくプリミティブ型です。最終は、変数の値を変更できないことを意味します。したがって、int
を使用すると、変数の値を変更できません。 int
の値を変更します。オブジェクト参照では、参照の値、つまり参照するオブジェクトを変更できません。
参照のみが最終的なものであり、そのメソッドは、非最終参照の場合と同様に呼び出すことができます。
Collections.unmodifiableMap(map)
を使用して、マップを変更不可にします。
Collections.unmodifiableMap
ハッシュテーブルの変更不可能なラッパーを取得します。
例:
import Java.util.*;
class Test{
public static final Map<String,Integer> MYHASH;
static{
Hashtable<String,Integer> tmp =
new Hashtable<String,Integer>();
tmp.put("A",65);
tmp.put("C",67);
MYHASH = Collections.unmodifiableMap(tmp);
}
public static void main(String[] args){
System.out.println(MYHASH.get("A"));
//this will throw
//Java.lang.UnsupportedOperationException
MYHASH.put("B",66);
}
}
Collections.unmodifiableMap( MYHASH )
を使用して、Hashtable
を変更不可能なマップでラップしてみてください。マップ内の何かを変更しようとすると、つまり、エントリを追加または削除しようとすると、例外がスローされます。 (MYHASH
はMap<String, String>
ではなくHashtable<String, String>
型でなければなりません。)
final
キーワードに関して:他の人がすでに述べたように、別のHashtable
をMYHASH
に割り当てることはできませんが、マップ自体はまだ変更可能であることを意味します。これを変更するには、上記のUnmodifiableMap
のような不変のラッパーでラップする必要があります。
ジョーが言ったように、これはfinal
がオブジェクトではなく参照をマークするためです。
ただし、Collections.unmodifiableMap
( こちら を参照)
フィールドと変数の場合、final
を使用すると、それらを1回だけ割り当てることができます。すぐに、またはしばらくしてから(たとえば、フィールドのコンストラクターで)。これは、実際のインスタンスが不変になるという意味ではありません。ハッシュテーブルは、変数への割り当て方法に関係なく、エントリを追加できるデータ構造です。 参照のみが最終です。