Hadoop で使用しようとしているサードパーティ クラスがあるため、それを実装する必要がありますWritable
。問題は、Hadoop が使用する方法Writable
が object を作成しo = SomeObject()
、次に de-serialize を呼び出すo.readFields(in)
ことであり、私の状況では空のオブジェクトを作成できないことです。
public abstract class Cube {
protected final int size;
protected Cube(int size) { this.size = size; }
}
注意事項size
ですfinal
。
public class RealCube {
public Cube(int size) { super(size); }
}
ここRealCube
では、呼び出すスーパー コンストラクターが 1 つだけあり、そのコンストラクターがfinal
抽象スーパー クラスに変数を設定します。
public class RealCubeWritable implements Writable {
public void readFields(DataInput in) {
/* yikes! need to set the size */
}
}
を実装しようとするとRealCubeWritable
、コンストラクターを持つことができず、ストリームを調べるまでRealCubeWritable()
実際のことを知ることができません。size
DataInput
したがって、Hadoop でこれを行う唯一の方法はラッパーを使用することです。私が疑問に思っているのは、ラッパーを使用する方法があるかどうかですが、RealCubeWritable
それでも動作しRealCube
ますか? 動的プロキシ クラスの使用を検討しましたが、これが機能するかどうか (または実際にどのように行うか) はわかりません。
ありがとう!