2014-02-05 134 views
3

我与节俭关于数据类型卡住了。Apache Thrift,Java:对象数据类型

现在,当我映射和整数值的节俭生成的豆,我在idl定义中使用i32类型。

class MyBean { 
    Integer i = null; 
} 

struct TMyBean { 
    1: i32 i; 
} 

的问题是,在TMyBean生成豆,我该变种是一个int基本类型,比它把0作为默认值,并为我0这是一个有效的值。

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

我该如何处理这种情况?我需要我接受TMyBean i var中的空值。

谢谢,菲德拉..

+0

这是一个通用的thrift-java原始对象问题。存在于所有基元中 - 不仅仅是整数。 –

+0

...不仅在Java中 – JensG

回答

1

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

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

1

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

:为有一个属性myValue,下面生成的Java方法将有助于检查它是否是空旧货struct TMyBeanisSetMyValue() 如果你想废了原始的,使用: setMyValueIsSet(false)

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