3

我有一个使用 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并具有适当的类层次结构。这失去了自动生成代码的好处,但似乎也是最健壮的选择,但也非常费力。

其中哪一个是最好的?还是有更好的选择?

4

0 回答 0