Null-safe valueOf方法

时间:2014-11-19 15:47:27

标签: java

我需要将几个String值转换为Integer,Boolean等,但由于输入值可能为null,因此我不能使用Integer.valueOf()方法。如果输入为null,我也需要输出对象为null,所以我不能使用apache commons NumberUtils.toInt()。是否存在现有的实现或更好的解决方案,而不仅仅是为每种类型编写实用程序方法(整数,布尔等)?

编辑:添加代码示例

String maxAgeStr = settings.get("maxAge"); //settings is a map, which may or //may not contain maxAge constraints.setMaxAge(Integer.valueOf(maxAgeStr)); // need null safety here String enableActionStr = settings.get("enableAction"); constraints.setEnableAction(Boolean.valueOf(enableActionStr)); // need null safety here

3 个答案:

答案 0 :(得分:7)

使用commons-lang NumberUtils.createInteger()方法:

NumberUtils.createInteger(null); // null
NumberUtils.createInteger("5"); // 5

答案 1 :(得分:2)

您的settings对象应该支持具有不同返回类型的getter方法,例如:

public String getString(String name);

public int getInt(String name);

public boolean getBoolean(String name);

同样为了简单起见,您可以提供通用的get()

public <T> T get(String name);

通过这种方式,您可以在一个位置(在设置中)进行转换,并且所有读取和使用设置的代码都将保持类型安全且无需进行大量转换。此外,您可以在一个中心位置引入默认值。

如果您没有很多设置,最好为每个设置添加直接的getter方法,例如:

public int getMaxAge();

public boolean isEnableAction();

答案 2 :(得分:2)

触及Java 8:

Optional<String> maxAgeStr = Optional.ofNullable(settings.get("maxAge"));
maxAgeStr.ifPresent((str) -> { constraints.setMaxAge(Integer.valueOf(str)); });

Optional<String> enableActionStr = Optional.ofNullable(settings.get("enableAction"));
constraints.setEnableAction(Boolean.valueOf(enableActionStr.orElse(false))); 

Optional<String> enableActionStr = Optional.ofNullable(settings.get("enableAction"));
constraints.setEnableAction(Boolean.valueOf(enableActionStr.orElseGet(() -> i%2 == 0)));