2013-06-28 4 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', .. classes – 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 

Вы также можете использовать отражение, чтобы реализовать это. В зависимости от того, какие критерии предназначены для определения добавленных полей, это может уменьшить (или исключить) повторяющийся код. Но производительность, вероятно, будет на порядок более медленным, а код может be fragile; например если поля добавлены или удалены ... или «шаблон» сломан.


Есть ли более быстрый способ написания все эти кода?

Это действительно зависит от точных деталей «повторяемости» ... а также от ваших навыков работы с IDE/редактором. Например, если ваша среда разработки поддерживает что-то вроде макросов emacs, вы можете эффективно генерировать исходный код из имен полей. Если бы вы были искусны в этом, вы могли бы сделать это за меньшее время, чем требуется, чтобы написать и протестировать отражающую версию.

+0

Фактически выполнение проверки типа string! = Null && string.equals ("") может быть немного быстрее, чем использование StringUtils.isEmpty, если метод не встроен. –

+3

Это может быть правдой, но разница, вероятно, снизится в шуме. (Вот почему вы всегда должны «сначала профилировать» ...) –

+0

@WilliamMorrison Либо вы называете это часто, и это * будет * быть встроенным (это путь короче, чем порог размера inlining), либо нет, и это не так вопрос ... – assylias