检查替换多个变量中的空值 java

Check an replace null values in multiple variables java

我试图找到一种简单的方法来在 Java 中的多个变量中执行多个空值检查/替换。

我有一个包含大约 20 个字符串变量的对象。在构造函数中,我想检查是否有任何变量值为空。如果它们为空,我想用空字符串替换它们。我可以执行一系列 if 语句,但我觉得必须有一种更简洁的方法来执行此操作。

除非你想求助于反射(我强烈反对),否则你最好的选择可能是创建一个辅助方法 (return s == null ? "" : s) 并执行

field1 = nullToEmpty(field1);
field2 = nullToEmpty(field2);
...

如果您已经依赖 Apache Commons 或 Guava,您可以使用 StringUtils.defaultString or Strings.nullToEmpty

public static String checkNull (String inputString){
    if(inputString == null){
         inputString = "";
    }
    return inputString;
}

只要你想检查一个字符串就调用它。

将你的变量存储在一个数组中(或者列表,如果你不知道变量的确切数量但我不这么认为)并循环它

String[] variables;
//...
for(int i = 0; i < variables.length; i++)
    if(variables[i] == null) variables[i] = "";

20 个字段变量听起来像是一个令人震惊的案例。您应该尽量避免在任何情况下显式处理那么多变量,或者至少对代码进行分解,以便它们只显式列在一个地方。

一个常见的模式是将每个变量与一个枚举相关联,并将枚举用作类型为 Enum -> String 的 Map 中的键,或者将枚举的序数用作大小为 String 数组的索引枚举值。

像这样:

public enum StringProperties {
    TTL, RECVBUF, SENDBUF, RETRIES, ... ;
}

如果您想要明确的默认值,您可以将枚举与多个参数结合起来:

public enum StringProperties {
    TTL ("100"), 
    RECVBUF ("1024"), 
    SENDBUF ("1500"), 
    RETRIES ("10"), 
    ... 
    ;
    public String getDefaultValue() { ... }
}

此策略意味着如果您需要 add/remove 一个 属性 或更改默认值,您的代码只需最少的修改。

在您的(复制构造函数?)案例中,您可以使用以下内容循环枚举值:

for (StringProperties property : StringProperties.values()) {
    if (obj.getProperty(property) != null) {
        // handle present case
        ...
    } else {
        // handle default storage case
        ...
    }
}

或者,如 thomas 所说,您可以单独使用 String 数组,但这假设您不需要一种方法来寻址每个 String。

对于每个字段使用标准 Java 方法:

Objects.toString(field, "");

尽可能避免使用包含大量字段的构造函数。请改用 Builder(如 有效 Java 中的建议,第 2 项:在面对许多构造函数参数时考虑构建器)。

查看 Apache Commons' StringUtils

StringUtils.defaultString(yourString)

这会将 nulls 替换为空字符串。或者您可以定义自己的替换:

StringUtils.defaultString(null, "foo") // returns "foo"

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#defaultString(java.lang.String)

我同意 aioobe 的观点,使用反射是你应该像瘟疫一样避免的事情。但是如果你幸运地拥有一个项目,例如你必须手动模拟一个 REST 接口,并且通过这个接口来的对象内部有大量的 Integer、String、Double 等,我认为你别无选择。

这是一个通用方法,它用标量默认值替换它在对象中可以找到的所有空指针,用空字符串填充字符串字段,如果它找到的对象具有无参数默认构造函数,则递归执行此操作。希望这也能帮助其他处于相同情况的人。

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();
        }
    }
}