0

タイトルが誤解を招く可能性があります。

これは実際に私の最近の JAVA インタビューの 1 つからのもので、インタビュアーは私に次の質問をしました: HashMap 型のパラメーターがある場合、受け入れメソッドでユーザーがこの HashMap を変更できないことをどのように確認できますか? (つまり、get() メソッド)

私はインタビュー中に final を使用すると言いましたが、インタビュアーはまったく評価しませんでした。オンラインでこのトピックをしばらく検索しましたが、まだ手がかりがありません.

専門家が助けてくれるでしょうか?ありがとう

4

7 に答える 7

1

C ++のバックグラウンドから来ているようですが、パラメーターconstを作成すると、メソッドがオブジェクトを変更できなくなります。Javaでは、finalその変数への割り当てのみを防止します。オブジェクト自体を変更するメソッドを引き続き呼び出すことができます。

したがって、たとえば:

void callingMethod() {
   HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
   map.put(1, 2);

   badMethod(map);

   // NullPointerException
   System.out.println(map.get(1).intValue());
}

void badMethod(final HashMap<Integer, Integer> map) {
   map.clear();
}

これを防ぐには、いくつかの方法があります。

  1. メソッドを呼び出す前に防御コピーを作成します
  2. コレクションを使用して、変更できないラッパーでオブジェクトをラップします
  3. Guavaが提供するような明示的に不変の型を使用する
于 2013-03-21T14:49:53.833 に答える
1

of を使用しfinalても、参照でメソッドを呼び出すことはできません。参照自体を変更不可にするだけです。だからあなたの答えは間違っていました。

私の提案は、ジェネリックを使用することです(プログラムではなく、そのようなインタビューにのみ使用してください!):

    Map<String, String> map = new HashMap< String, String >();
    map.put("a", "b"); // OK

    Map< ? extends String, ? extends String > mapRO = new HashMap< String, String >();
    mapRO.put("a", "b"); // Compile error
    String value = mapRO.get("a"); // OK

ご覧のとおり、ジェネリック型を非表示にすると? extends ...、「書き込み」メソッド ( などput) が呼び出されなくなります。これは、通常、型を完全に定義する必要があるためです。しかし、それでも を呼び出すことができるclear()ので、これは非常にプール セキュリティの概念です。

また、すべての「書き込み」メソッド呼び出しで例外をスローするラッパーを使用することもできます。

于 2013-03-21T14:58:25.710 に答える
0

Collections.unmodifiableMap(myMap)読み取り専用マップを返します。これによって返されるMapオブジェクトで作業する必要があります。

于 2013-03-21T14:50:44.323 に答える
0

このようなハッシュマップから変更不可能なコレクションを作成するのはどうですか?

次に、次 のyourMethod(Collections.unmodifiableMap(yourHashmap)); ようにします。finalのみを使用するということは、その参照をこのブロック内の別の参照で上書きできないことを意味し、そのオブジェクトに対するメソッド呼び出しを妨げることはありません。

于 2013-03-21T14:47:09.683 に答える
0

Collections.unmodifiableMapを使用して、渡すマップをラップします

于 2013-03-21T14:49:29.330 に答える
0

それは不変または変更不可能なマップだと思います。

Collections#unmodifiableCollection

指定されたマップの変更不可能なビューを返します。この方法により、モジュールはユーザーに内部マップへの「読み取り専用」アクセスを提供できます。返されたマップに対するクエリ操作は、指定されたマップまで「読み取り」、直接またはそのコレクション ビューを介して返されたマップを変更しようとすると、UnsupportedOperationException が発生します。

参照

于 2013-03-21T14:48:39.503 に答える
0

2つの方法があります

1) this.map = Collections.unmodifiableMap(map);

2) 防御的コピー: this.map = new HashMap(map);

于 2013-03-21T14:59:04.087 に答える