6

そのため、ちょっと奇妙に見えると思われるコードに出くわしました。あなたの意見のいくつかがこれについてどうであるかを見たかった

public class Test {

   public static void main(String[] args) {

      HashMap m = new HashMap();
      Test2 t2 = new Test2();
      t2.fill(m);
   }
}

public class Test2 {

    public void fill(HashMap m) {
        m.put(new Integer(0), new Integer(0));
    }

}

このコードは問題ありませんか、それとも別の方法で実行する必要がありますか?

ありがとう

4

3 に答える 3

8

Java のオブジェクトは参照によって渡されるため、これはまったく問題ありません。メソッド内で m に直接代入しようとすると、間違っています。

m = new HashMap();

ただし、サンプル コードの場合と同様に、渡された参照を使用して、引数として渡されたオブジェクトを変更できます。

オブジェクトの場所を関数に渡すと考えてください。この位置情報を使用して、いじることができます。ただし、場所は単なる値であるため、場所 ( ) に割り当てても、関数を呼び出す場所にmは影響しません。mそのため、この記事では、引数は値渡しであると述べています。

于 2012-12-14T01:30:17.717 に答える
4

メソッドにマップを渡して、そのメソッドがマップを操作しても問題ありませんか? もちろん。

マップは型指定されていません。する必要がありますMap<Integer,Integer>。コンパイラを使用して、物事を正しく行うことができます。ジェネリック型を使用すると、自動ボクシングも使用できるようになるため、より簡潔にすることができますput(0,0)

MapHashMap が明示的に必要でない限り、マップはではなくとして渡す必要がHashMapあります (HashMap の場合はそうではありません)。可能な限り、実装ではなくインターフェースを使用してください。

名前fillは私には悪い名前のように見えます - それは何も「満たす」ようには見えません.


余談ですが、魔法の匿名クラスの初期化に反対することをお勧めします。

Map<Integer, Integer> m = new HashMap<Integer, Integer>() {{
    put(0, 0);
    }};

単純な初期化ブロックを支持して:

Map<Integer, Integer> m = new HashMap<Integer, Integer>(); {
    m.put(0, 0);
    }

これにより、形式の冗長な匿名内部クラスファイルの作成が回避されますSomeClass$n.class

于 2012-12-14T01:28:51.440 に答える
0

私はこれを行います:

Map<Integer, Integer> m = new HashMap<Integer, Integer>() {{
    put(0, 0);
}};

ここで使用されている Java カンフーの内訳は次のとおりです。

  • 地図は入力されています<Integer, Integer>
  • これは、マップを初期化するためのインスタンス ブロックを持つ匿名クラスです。
  • put(0, 0)ではなくを使用していることに注意してください。m.put(new Integer(0), new Integer(0))オート ボクシングを使用しています。
于 2012-12-14T01:38:19.860 に答える