Apache Thrift,Java:对象数据类型

3

我在使用Thrift处理数据类型时遇到了问题。

现在,当我将一个整数值映射到一个由Thrift生成的bean时,我在IDL定义中使用i32类型。

class MyBean {
  Integer i = null;
}

struct TMyBean {
  1: i32 i;
}

问题在于TMyBean所生成的bean中,i变量是一个int原始类型,这使得默认值为0,但对于我来说,0是一个有效值。
我尝试在idl文件中添加可选关键字,但事情并没有改变,它仍然是int类型。
我该如何处理这种情况呢?我需要让TMyBean中的i变量接受null值。
谢谢,Phaedra..

这是一个通用的thrift-java原始对象问题。不仅适用于整数,而是适用于所有原始类型。 - AlikElzin-kilaka
不仅限于Java。 - JensG
3个回答

2
< p >“可选”关键字是正确的选择。

要测试特定的“可选”字段是否设置,请使用“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 ...

}

2
每个从thrift结构生成的Java类都有检查基本类型是否设置的方法。虽然比自动装箱要繁琐,但它是有效的。
例如:对于一个thrift结构TMyBean,它有一个属性myValue,以下生成的Java方法将帮助检查它是否为null: isSetMyValue() 如果您想将原始值设置为null,请使用: setMyValueIsSet(false)。
*我不明白为什么Thrift决定不在Java中使用可选的基本类型作为对象,并让自动装箱发挥其魔力。也许是因为大型集合?无论如何,这似乎是另一个优先考虑性能而不是简单性的问题。

1
Java中的整数是一个类,而不是基本类型。Thrift只允许您使用已定义的原始类型i16、i32、i64、double表示数字。在Java中i32 i等同于int i;;如果没有设置,则int在Java中默认为0。如果要使用类,则必须有一个Thrift定义该类,以供引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接