我使用IDL定义的Avro架构看起来类似于以下内容:
protocol MyProtocol {
record Gizmo {
string name;
int cost;
int weight;
}
record Gadget {
string name;
int cost;
double width;
double height;
}
record Order {
long id;
array<union{Gizmo, Gadget}> items;
}
}
我正在使用此架构中自动生成的Java类。除了可以在items数组中的Gizmos和Gadgets之外,还有更多类型,但是我们要求所有类型都有名称和成本。
根据我的理解,没有办法为Avro记录指定继承,因此Order对象上的getItems()
必然会给我List<Object>
。也就是说,我想要一些具有更多背景和类型安全性的东西;到目前为止,我已经提出了三种方法,但它们似乎都不太合适。
方法1:对List<SpecificRecord>
执行未经检查的转换(实际上是对List
的转换,然后是另一个转换为List<SpecificRecord>
,因为泛型工作原理)并使用get(int field)
,知道名称和费用将分别为字段1和2。一旦我得到那些,我也必须将它们转换为适当的类型。这似乎非常脆弱。
方法2:迭代items数组,并逐个转换每个项目。我可以转换为SpecificRecord
并在第一种方法中使用索引get,或执行一系列instanceof
检查,然后按名称获取字段。这要么是脆弱的,要么是费力的。
方法3:编写我自己的实现SpecificRecord
的类并具有适当的类层次结构。这会失去自动生成代码的好处,但似乎也是最强大的选择,但也非常费力。
哪一项最好?或者有更好的选择吗?