2011-08-10 46 views
3

如果我們必須區分類中屬性的'undefined'值和'null'值,那麼應用程序中遵循的常用方法是什麼?如何實現java數據類型的undef和null值之間的差異

例如,假設我們有一個A級

public class A { 
Integer int1; 
Boolean bool1; 
Double doub1; 
String str1; 
} 

在代碼中,我們要區分,如果A的每個屬性設置或不設置(null是一個有效的值來設置) 。

一種方法是從java數據類型擴展自定義數據類型。其他方法是爲每個數據類型分配一些任意不可達的值,並將這些值作爲undef處理。

還有其他更好的方法嗎?

+1

你會如何爲'Boolean'定義'不可達值'? – sje397

+0

目的是什麼? –

+0

@ sje397,是的,這種方法不適用於布爾值。 – Ramesh

回答

6

我會用泛型來創建一個包含'set'標誌的包裝器。

public class Settable<T> { 

    private boolean isSet = false; 
    private T value; 

    public Settable() {} 

    public boolean isSet() {return isSet;} 
    public T value() { return value;} 
    public void set(T t) { value = t; isSet = true;} 
} 

...然後用你的課堂聲明你的課程。

public class A { 
    //... 
    Settable<Integer> int1; 
    //... 
} 
+1

+1。所以澄清:由於設置爲'null'是允許的,'isSet'爲false表示在這裏未定義? –

+0

@忽必烈 - 這就是我的想法。我猜'isDefined'也可以起作用:) – sje397

1

如果您對未定義的值調用getter,應該返回什麼?是否應該退還退款?還是null?

根據你可以管理持有者類本身的未定義值(想到BitSet)並提供isXXXSet()函數,或者使用sje397的Settable。

+0

當調用getter時,對於未定義的操作的好處。拋出異常是另一種可能性。取決於我如何使用它 –

1

作爲sje397的答案的替代方法,您可以編寫一個簡單的具體類,類似Reference。將參考字段本身設置爲null以指示未設置或未定義。

public class Ref<T> { 
    private T value; 

    /** 
    * Sets the reference 
    * @param value the new value 
    */ 
    public void set(T value) { 
     this.value = value; 
    } 

    /** 
    * Get the referenced value 
    * @return the value 
    */ 
    public T get() { 
     return this.value 
    } 

    /** 
    * Syntatic sugar factory 
    * @return a Ref<T> 
    */ 
    public static Ref<T> to(T value) { 
     Ref<T> ref = new Ref<T>(); 
     ref.set(value); 
     return ref; 
    } 
} 

使用,如:

public class A { 

    Ref<Integer> int1; 
    Ref<Boolean> bool1; 
    // etc. 
} 

int1最初將null或取消。要設置它,只是去:

a.int1 = Ref.to(someInt); 

要設置null值:

if (a.int1 != null) { 
    a.int1.set(null); 
} else { 
    a.int1 = Ref.to(null); 
} 

來取消,那麼就設置參考自身null

這種方法的主要區別是跟蹤設置/取消設置狀態的變量較少。但是,這需要對字段本身進行空值檢查,如上所示。

我個人會選擇這種方法,如果值設置後相對不變。也就是說,它們要麼未設置,要麼設置爲不變的值(可能爲null),在這種情況下,我會完全刪除set()方法。

相關問題