2013-06-28 51 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

相关问题