2013-06-28 83 views
2

我有這種類型的代碼:如何批量檢查空字符串的許多變量?

HashMap out = new HashMap(); 
if(!StringUtils.isEmpty(foo.a)) { 
    out.put(A.A_NAME, foo.a); 
} 
if(!StringUtils.isEmpty(foo.b)) { 
    out.put(B.B_NAME, foo.b); 
} 
if(!StringUtils.isEmpty(foo.c)) { 
    out.put(C.C_NAME, foo.c); 
} 
//... many continues here 

是否有寫所有這些代碼的一個更快的方法?

+0

什麼是A,B,C?枚舉? – assylias

+0

@assylias'A.A_NAME'等。是'A'中的最終靜態字段,..類 – texasbruce

+0

foo是否只包含這些靜態字段? –

回答

2

如果字段不爲static,那麼你可以這樣做:

Test t= new Test(); 
for (Field field : t.getClass().getDeclaredFields()) { 
    if (field.getType().equals(String.class) && !((String)field.get(t)).isEmpty()) { 
     System.out.println(field.get(t)); 
    } 
} 

否則,如果他們是static使用null代替t

field.get(null) 
+0

我期待着這裏的一些反思......是的! – texasbruce

+3

@texasbruce它會減少代碼行數,但速度不會更快,這是您的問題。 – assylias

+0

@assylias我更新了問題。 – texasbruce

3

是否有這樣做的一個更快的方法這個?

在性能方面,沒有。 (或者至少...改進的範圍可能是不值得理會。)

在代碼和可讀性線方面,你可以通過編寫和使用這樣的方法重構代碼:

private void addIfNonempty(HashMap map, String name, String value) { 
    if (!StringUtils.isEmpty(value)) { 
     map.put(name, value); 
    } 
} 

addIfNonempty(out, A.A_NAME, foo.a); 
addIfNonempty(out, B.B_NAME, foo.b); 
// etcetera 

你也可以使用反射來實現這一點。根據標識要添加的字段的標準,這可以減少(或消除)重複的代碼。但表現很可能是一個數量級的減少,並且代碼可能是脆弱的;例如如果字段被添加或刪除...或「模式」被破壞。


是否有寫所有這些代碼的一個更快的方法?

它確實取決於「重複性」的確切細節......以及您的IDE /編輯技能。例如,如果您的IDE支持emacs鍵盤宏之類的東西,則可以從字段名稱中有效地生成源代碼。如果你擅長這一點,你可以用比編寫和測試反射版本更少的時間來完成。

+0

實際上,如果沒有內聯方法,就像string!= null && string.equals(「」)這樣的檢查可能比使用StringUtils.isEmpty快一點。 –

+3

這可能是事實,但差異很可能會降低。 (這就是爲什麼你應該總是「簡介」的原因......) –

+0

@WilliamMorrison要麼你經常打電話,它會*內聯(它比內聯大小閾值短)或者你不這樣做,它不問題... – assylias

相關問題