我正在尝试找到一种在Java中执行多个变量的null检查/替换的简单方法。
我有一个包含大约20个字符串变量的对象。在构造函数中,我想检查任何变量值是否为null。如果它们为null,我想将它们替换为空字符串。我可以执行一系列if语句,但我觉得一定有更简洁的方法来实现这个目标。
我正在尝试找到一种在Java中执行多个变量的null检查/替换的简单方法。
我有一个包含大约20个字符串变量的对象。在构造函数中,我想检查任何变量值是否为null。如果它们为null,我想将它们替换为空字符串。我可以执行一系列if语句,但我觉得一定有更简洁的方法来实现这个目标。
return s == null ? "" : s
),然后执行。field1 = nullToEmpty(field1);
field2 = nullToEmpty(field2);
...
StringUtils.defaultString
或Strings.nullToEmpty
。static void fillNullObjects(Object object) {
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
if (field.get(object) != null) {
continue;
}
else if (field.getType().equals(Integer.class)) {
field.set(object, 0);
}
else if (field.getType().equals(String.class)) {
field.set(object, "");
}
else if (field.getType().equals(Boolean.class)){
field.set(object, false);
}
else if (field.getType().equals(Character.class)) {
field.set(object, '\u0000');
}
else if (field.getType().equals(Byte.class)) {
field.set(object, (byte) 0);
}
else if (field.getType().equals(Float.class)) {
field.set(object, 0.0f);
}
else if (field.getType().equals(Double.class)) {
field.set(object, 0.0d);
}
else if (field.getType().equals(Short.class)) {
field.set(object, (short) 0);
}
else if (field.getType().equals(Long.class)) {
field.set(object, 0L);
}
else if (field.getType().getDeclaredFields().length > 0){
for (Constructor<?> constructor : field.getClass().getConstructors()) {
if (constructor.getParameterTypes().length == 0) {
field.set(object, constructor.newInstance());
fillNullObjects(field.get(object));
}
}
}
} catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
看看Apache Commons的StringUtils
。
StringUtils.defaultString(yourString)
这将使用空字符串替换null
值。或者您可以定义自己的替换:
StringUtils.defaultString(null, "foo") // returns "foo"
public static String checkNull (String inputString){
if(inputString == null){
inputString = "";
}
return inputString;
}
只需在需要检查字符串时调用该函数。
return inputString == null ? "" : inputString;
。 - aioobe将变量存储在数组中(如果您不确定变量的数量,则可以使用列表),并循环遍历它
String[] variables;
//...
for(int i = 0; i < variables.length; i++)
if(variables[i] == null) variables[i] = "";
20个字段变量听起来像是一个极端的情况。在任何情况下,您都应该尽量避免明确处理那么多变量,或者至少将代码分解成它们只在一个地方明确列出。
一种常见的模式是将每个变量与枚举关联,并使用枚举作为映射的键,类型为Enum -> String,或者使用枚举的序数作为索引到大小为Enumeration值的String数组中。
像这样:
public enum StringProperties {
TTL, RECVBUF, SENDBUF, RETRIES, ... ;
}
public enum StringProperties {
TTL ("100"),
RECVBUF ("1024"),
SENDBUF ("1500"),
RETRIES ("10"),
...
;
public String getDefaultValue() { ... }
}
for (StringProperties property : StringProperties.values()) {
if (obj.getProperty(property) != null) {
// handle present case
...
} else {
// handle default storage case
...
}
}
对于每个字段,请使用标准的Java方法:
Objects.toString(field, "");