检查替换多个变量中的空值 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)
这会将 null
s 替换为空字符串。或者您可以定义自己的替换:
StringUtils.defaultString(null, "foo") // returns "foo"
我同意 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();
}
}
}
我试图找到一种简单的方法来在 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)
这会将 null
s 替换为空字符串。或者您可以定义自己的替换:
StringUtils.defaultString(null, "foo") // returns "foo"
我同意 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();
}
}
}