我有一个使用 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 类。除了 Gizmos 和 Gadgets 之外,还有很多类型可以在 items 数组中,但是让我们规定所有类型都有名称和成本。
据我了解,没有办法为 Avro 记录指定继承,所以getItems()
Order 对象必然会给我List<Object>
. 也就是说,我想要更多上下文和类型安全的东西;到目前为止,我已经提出了三种方法,但它们似乎都不是很可口。
方法 1:执行未经检查的转换为List<SpecificRecord>
(实际上是转换为List
,然后是另一个转换为,List<SpecificRecord>
因为泛型的工作原理)并使用get(int field)
,知道名称和成本将分别是字段 1 和 2。一旦我得到这些,我也必须将它们转换为适当的类型。这似乎非常脆弱。
方法 2:遍历 items 数组,并单独转换每个项目。我可以像第一种方法一样强制转换SpecificRecord
并使用索引获取,或者执行一系列instanceof
检查,然后按名称获取字段。这要么是脆弱的,要么是费力的。
方法 3:编写我自己的类来实现SpecificRecord
并具有适当的类层次结构。这失去了自动生成代码的好处,但似乎也是最健壮的选择,但也非常费力。
其中哪一个是最好的?还是有更好的选择?