【问题标题】:Reconciling the lack of inheritance in thrift with method definitions in Java/Scala协调 Thrift 中缺乏继承与 Java/Scala 中的方法定义
【发布时间】:2017-06-04 20:27:08
【问题描述】:

我在Thrift 中定义了一组结构。从概念上讲,其中一些结构是公共父类的子类。由于Thrift不支持结构继承,所以我使用以下策略来定义结构:

示例

AB 是父type P 的子类型。以下是我的节俭定义来表示:

struct P {
  1: i32 childType,
  2: list<byte> payload
}

struct A {
  1: i32 x
}

struct B {
  1: i32 y
}

type A and B 的对象被序列化为type P 的记录(payload 字段将存储对象的序列化版本,childType 的值将指示序列化的有效负载是否为type A or B)。在反序列化期间,childType 字段的值将指示需要如何反序列化 payload

但是,当使用 Java 或 Scala 等面向对象的语言编写代码时,这种方法会带来困难。例如,在返回type P 对象的函数中,我无法返回type Atype B 的结果。

问题

(i) 有没有推荐的方法来处理这个问题?即,如何协调Thrift 中缺少继承与Java/Scala 利用继承的代码?

提前致谢。

【问题讨论】:

    标签: java scala oop inheritance thrift


    【解决方案1】:

    我不知道 Java/Scala 是否有更好的方法,但在我们的例子中,添加一个额外的 Thrift 结构成员指向它的“超级”Thrift 结构可以满足我们的需求。

    struct Foo {
        1: i32 wtf
    }
    
    struct Bar {
        1 : Foo super_
        2 : double moredata
    }
    

    当然,这只是一种解决方法,但我们可以接受。

    【讨论】:

      【解决方案2】:

      另一种解决方法是使用 thrift 联合,尽管联合对 thrift 的支持(至少在某些语言中)不是很好。见docs

      我正在稍微更改您的示例(B.y 现在是字符串)以提供更好的示例。考虑一下这个 thrift 文件:

      struct A {
        1: i32 x
      }
      
      struct B {
        1: string y
      }
      
      union P {
          1: A a,
          2: B b
      }
      

      在 thrift 编译器 0.9.0 生成的 Java 代码中,P 类有多种方法可以用来确定 P 是否包含 A 或 B:isSetA/isSetBgetA/getB 和 @987654322 @ 返回一个指定类型的枚举。

      生成的代码:A.javaB.javaP.java

      【讨论】:

      • 此时A.java、B.java或P.java文件都不存在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      相关资源
      最近更新 更多