У меня есть сторонний класс, который я пытаюсь использовать в Hadoop, и поэтому мне нужно, чтобы он реализовал Writable
. Проблема в том, что Hadoop использует Writable
для создания объекта o = SomeObject()
, затем вызывает 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
имеет только один супер-конструктор для вызова, и этот конструктор устанавливает переменную final
в абстрактном суперклассе.
public class RealCubeWritable implements Writable {
public void readFields(DataInput in) {
/* yikes! need to set the size */
}
}
Когда мы приступаем к реализации RealCubeWritable
, у меня не может быть конструктора RealCubeWritable()
, и я не могу знать фактический size
, пока не будет проверен поток DataInput
.
Так что, похоже, единственный способ сделать это в Hadoop - это использовать обертку. Что мне интересно, если есть способ использовать обертку, но RealCubeWritable
по-прежнему ведет себя как RealCube
? Я изучал использование классов динамического прокси, но я не уверен, сработает ли это (или как на самом деле это сделать).
Спасибо!