6

これは、Javaの理解が不足していることを示している可能性がありますが、ほとんどのMapReduceプログラムでマッパークラスとレデューサークラスが静的として宣言されているのはなぜですか?

4

2 に答える 2

15

マッパークラスとレデューサークラスを別のクラスの内部クラスとして宣言する場合は、親クラスに依存しないように静的に宣言する必要があります。

Hadoopはリフレクションを使用して、マップごとにクラスのインスタンスを作成するか、実行するタスクを減らします。作成された新しいインスタンスは、引数がゼロのコンストラクターを想定しています(そうでない場合、何を渡すかをどのように知るのでしょうか)。

staticキーワードなしで内部マッパーまたはreduceクラスを宣言することにより、javaコンパイルは実際に、親クラスのインスタンスが構築時に渡されることを期待するコンストラクターを作成します。

生成されたクラスファイルに対してjavapコマンドを実行すると、これを確認できるはずです。

また、staticキーワードは、親クラス宣言で使用された場合は無効です(そのため、トップレベルでは表示されず、子クラスでのみ表示されます)。

于 2012-07-20T01:44:20.857 に答える
1

私は2つの理由を考えることができます:

  1. map-reduceメソッドを実行する場合、オブジェクトに保存する必要のある状態は必要ありません。したがって、必要なすべての情報がメソッドに渡され、オブジェクトに追加のデータを格納する必要はありません。オブジェクトの存続時間が1つのメソッド呼び出しを超えない場合、なぜインスタンス化に苦労する必要がありますか?
  2. シングルトンパターンを実装するのと同様の理由で、複数のオブジェクトを使用することは意味がありません。
于 2012-07-19T23:20:14.463 に答える