2015-08-28 28 views
2

我在的Java/Groovy的兩個相似的物體,讓說:確定對象屬性的數據類型

class a { 
    Date creation 
} 

class a { 
    String creation 
} 

,並在我的計劃,有可能決定我應該使用什麼對象的開關(Groovy代碼) :

def obj 
if(/* certain criteria for a */) { 
    obj = new package.foo.a() 

    // ... 
    // Or some other process aside from initialization. 
} 
else if(/* certain criteria for the another a */) { 
    obj = new package.bar.a() 

    // ... 
    // Or some other process aside from initialization. 

} 
else { 
    obj = null 
} 

稍後在代碼中,我需要確定我應該執行基於房產creation類型的過程:

if(obj.creation instanceof Date) { 
    obj.creation = new Date() 
} 
else if(obj.creation instanceof String) { 
    obj.creation = '1995-08-17' 
} 

上面的代碼不起作用。有沒有辦法做到這一點?當然,我總是可以做以下如果屬性的數據類型,不能獲得:

if(obj instanceof package.foo.a) { 
    obj.creation = new Date() 
} 
else if(obj instanceof package.bar.a) { 
    obj.creation = '1995-08-17' 
} 
+0

您是否嘗試過obj.creation.getClass()? – Zarwan

+1

這不是有效的Java代碼。你的意思是JavaScript嗎? Groovy(按照原始)? – EJP

回答

1

有時取決於必要的對象的類型,但應避免使用,因爲它使代碼更脆弱。您可能最終會在您的代碼庫中散佈類型檢查。就你而言,你可以將類特定的行爲委託給類本身。這裏有一個例子:

class A { 
    Date creation 

    void initializeCreationDate() { 
     creation = new Date() 
    } 
} 

/* I'm using a different class name to make this 
* example self-contained. 
*/ 
class B { 
    String creation 

    void initializeCreationDate() { 
     creation = '1995-08-17' 
    } 
} 

def obj 
def condition = true 

if(condition) { 
    obj = new A() 
} else { 
    obj = new B() 
} 

obj.initializeCreationDate() 

在這個例子中,這兩個類負責設置自己的創建日期。這有助於保持代碼的漂亮和整潔。

使用一個混合代替

您仍然可以達到甚至當你無法(或不願)修改這兩個類的源代碼相同的效果。在這種情況下,您可以使用mixin來添加initializeCreationDate()方法。像這樣:

class A { 
    Date creation 
} 

/* I'm using a different class name to make this 
* example self-contained. 
*/ 
class B { 
    String creation 
} 

class DateInitializer { 
    static void initializeCreationDate(A object) { 
     object.creation = new Date() 
    } 

    static void initializeCreationDate(B object) { 
     object.creation = '1995-08-17' 
    } 
} 

def obj 
def condition = true 

if(condition) { 
    obj = new A() 
} else { 
    obj = new B() 
} 

obj.metaClass.mixin DateInitializer 
obj.initializeCreationDate() 
2

你可以嘗試獲取對象的class並檢查其是否具有相同的class爲您打算使用的檢查:

if(obj.creation.getClass().equals(Date.class)) { 
    obj.creation = new Date(); 
} 
else if(obj.creation.getClass().equals(String.class)) { 
    obj.creation = "1995-08-17"; 
} 
0

它不工作,因爲創建爲空。 null不是任何對象的實例。 您必須使用反射API來獲取字段類型,然後使用Class.isAssignableFrom()來檢查類型。

if(String.class.isAssignableFrom(a.class.getDeclaredField("creation").getType()){ 
    ... 
} 

我編輯它使代碼編譯:)

+0

*什麼*由於'創造'爲空而不起作用? – EJP

+0

請再次閱讀該問題。 他的代碼是 'if(obj.creation instanceof Date){ obj.creation = new Date() }' 後來他說上面的代碼不起作用。 所以,我說它不工作,因爲obj.creation爲null。 回答你的問題:是的。 – hussachai