2014-02-05 83 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中的對象,讓自動裝箱做它的魔法。也許是因爲大集合?無論如何,聽起來似乎比簡單性更喜歡性能的另一個優先問題。