2016-12-27 82 views
0

我有實現MarkerInterface對象的列表:如何檢查對象是否有一個字段

List<MarkerInterface> list = new ArrayList<>(); 

根據我加的人,騎自行車的人或狗對象到列表中的文件。這些類實現MarkerInterface。

list.add(person); 

list.add(dog); 

list.add(biker); 

一些這些類的子類有:DOG1延伸狗,DOG2延伸狗,... 有些類有parentId的領域,別人沒有按「T。

我想檢查一個對象是否有parentId字段,並打印它的值,如果它存在。 如何做到這一點? 我想:

list.get(i).getParentId(); 

,但它不會工作,因爲MarkerInterface不能有getParentId()方法(未實現MarkerInterface有parentId的字段中的所有類)。

+3

你需要另外一個接口,比如'MarketWithParent extends MarketInterface',其中'getParent'將被定義,然後你將能夠使用''instanceof'''反射Java實例' –

+1

? http://tutorials.jenkov.com/java-reflection/fields.html – ThisClark

+1

@ThisClark。從技術上講,OP會更好地檢查'getParent_id'作爲方法而不是字段。這個領域很有可能是一個精心設計的課程的私密空間。 –

回答

1

如果parent_id字段不存在,您要打印什麼?

您可以通過查詢對象來查看它是否有字段 - 比方說,通過使用Java反射來檢查對象的字段。或者,正如Lashane在評論中所建議的那樣,您可以添加另一個界面並使用instanceof。但是我鼓勵你考慮其他方法,因爲明確地檢查一個類的字段或者詢問它的運行時類型往往是設計問題的一個標誌,可能會在以後再次出現。

另一種方法是將方法添加到返回要打印的字符串的接口。你可以有一個默認實現返回「」(或者你打印的任何東西,而不是parent_id,這就是爲什麼我帶領這個問題),然後在引入parent_id的基類中,你可以用一個實現來覆蓋parent_id 。

(順便說一下,它可能應該按照慣例拼寫parentId的,但是這也許不是對這個問題很重要...)

你可能再要組織的類層次結構,使得擁有一切變得PARENT_ID它(以及重載的實現返回它)通過一個共同的父類;這可能會或可能不適合您的需求。如果沒有更高級的模式可以用來最大限度地減少代碼重複,但是對於問題的範圍來說,這可能會深入一些。

+0

然後:字符串對於某些東西來說是一個相當糟糕的選擇像身份證一樣重要。它也許更好地考慮一個特定的id類型aka類。 – GhostCat

+0

這是真的;我沒有看到任何標識id的類型,所以只是假定它將被轉換爲用於打印目的的顯示字符串... –

+0

我將在一些我現在跳過的操作中使用id。 – Agnieszka

0

正如你所建議的,我創建了ParentIdInterface,它擴展了MarkerInterface並具有getParentId()方法。

if(list.get(i) instanceof ParentIdInterface) { 
    ParentIdInterface pi = (ParentIdInterface) list.get(i); 
    ... 
} 

現在它的工作原理就是我想要的。謝謝。

0

如果你想使用Java反射,你必須在類是這樣的:

public int parentId = 3; 

你可以得到這樣的價值:

try { 
     Field f = list.get(i).getClass().getField("parentId"); 
     int value = f.getInt(this); 
     System.out.println("parentId="+value); 
    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException| IllegalAccessException e) { 
     System.out.println("no Field named parentId"); 
    } 

但我會建議使用接口正如其他人所說的那樣。

相關問題