Apache Thrift,Java:对象数据类型

时间:2014-02-05 11:32:19

标签: java types thrift

我对Thrift的数据类型感到困惑。

现在当我将map和Integer值映射到thrift生成的bean时,我在idl定义中使用了i32类型。

class MyBean {
  Integer i = null;
}

struct TMyBean {
  1: i32 i;
}

问题是在TMyBean生成的bean中,i var是一个int基本类型,而不是将0作为默认值,而对于我来说它是一个有效值。

我试图将可选关键字放在idl文件中,但事情并没有改变,它始终是int。

我如何处理这种情况?我需要在TMyBean i var。

中接受空值

谢谢,Phaedra ..

3 个答案:

答案 0 :(得分:2)

optional关键字是正确的选择。

要测试是否设置了特定的optional字段,请使用isset标记:

struct MyBean {
  1: i32 IntValue
}

给出

public class MyBean implements org.apache.thrift.TBase<MyBean, MyBean._Fields>, java.io.Serializable, Cloneable, Comparable<MyBean> {

  // ... lots of other code omitted ...

  // isset id assignments
  private static final int __INTVALUE_ISSET_ID = 0;
  private byte __isset_bitfield = 0;

  // ... lots of other code omitted ...

  /** Returns true if field IntValue is set (has been assigned a value) and false otherwise */
  public boolean isSetIntValue() {
    return EncodingUtils.testBit(__isset_bitfield, __INTVALUE_ISSET_ID);
  }

  public void setIntValueIsSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __INTVALUE_ISSET_ID, value);
  }

  // ... even more code omitted ...

}

答案 1 :(得分:1)

java中的整数是一个类,而不是一个原始类。 Thrift只允许您使用定义的基元i16,i32,i64,数字加倍。 i32 i相当于Java中的int i;;如果未设置,则int在Java中始终默认为0。如果你想使用一个类,那么你必须有一个可以引用的类的Thrift定义。

答案 2 :(得分:1)

每个生成的java类(来自thrift结构)都有检查基元是否已设置的方法。它比自动装箱更麻烦,但有效。

示例:对于具有属性struct TMyBean的thrift myValue,以下生成的Java方法将有助于检查它是否为null: isSetMyValue() 如果要使基元无效,请使用: setMyValueIsSet(false)

*我不明白为什么Thrift决定不使用可选的原语作为Java中的对象,让自动装箱做它的魔力。也许是因为大集合?无论如何,听起来像是另一个优先考虑性能优于简单性的优先问题。