使用空字符串初始化所有字符串成员
问题描述:
我想将对象的所有字符串成员都设置为空字符串(如果它们为空)。使用空字符串初始化所有字符串成员
伪代码:
foreach member in object {
if (member instanceof String and member == null) {
member = '';
}
}
什么是实现这一目标的最简单方法是什么? 我可以使用的任何框架/工具? 通过反思写我自己的解决方案?
答
public static void setEmpty(Object object) throws IllegalArgumentException, IllegalAccessException {
Class<?> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (String.class.equals(field.getType())) {
field.setAccessible(true);
if (field.get(object) == null) {
field.set(object, "");
}
}
}
}
答
另一种方法是编写一个实用程序,该实用程序生成将空字符串设置为特定对象成员的代码。
答
赞成可重复使用的设计,你应该考虑使用空值的默认值,就像Apache的共同defaultString API,这样的事情:
public String getValue(String value){
return StringUtils.defaultString(value);
}
您也可以考虑使用defaultString(String str,String defaultStr)
,让你有选择如果有任何理由,将默认值更改为任何值。
StringUtils的documentation
答
尝试用AspectJ:
@Aspect
public class StringHandler {
@Around("execution(String com....YourClass.*(*))")
public Object handle(ProceedingJoinPoint thisJoinPoint) throws Throwable {
String s = (String) thisJoinPoint.proceed();
if (s == null){
return "";
}
return s;
}
}
这将是更快的运行时间,因为这一方面会被编译成字节码,否则 反射将在运行 - 使用时间并减慢你的应用程序。
为了什么目的?在相应的get()方法中执行此操作更容易,如果始终调用它,则会比影响实际值更容易。 – EJP
这些类由JAXB2生成,所以我不想更改它们。 – Sebi
如果您使用'.xsd'来为JAXB2定义架构,则可以在'.xsd'中直接定义'default'值。 – ante