Null-safe valueOf方法

9
我需要将几个String值转换为Integer、Boolean等类型,但是由于输入值可能为空,例如我不能使用Integer.valueOf()方法。如果输入为空,输出对象也必须为空,因此我不能使用apache commons NumberUtils.toInt()。是否存在现有的实现或比编写每种类型(Integer、Boolean等)的实用程序方法更好的解决方案?
编辑:添加代码示例 String maxAgeStr = settings.get("maxAge"); //settings是一个Map,可能包含maxAge constraints.setMaxAge(Integer.valueOf(maxAgeStr)); // 需要空值安全性 String enableActionStr = settings.get("enableAction"); constraints.setEnableAction(Boolean.valueOf(enableActionStr)); // 需要空值安全性

为什么需要针对每种类型编写代码?如果(input==null)返回null;否则NumberUtils.toInt()。我不理解的是什么? - Attila Neparáczki
我只是想知道是否已经存在一个库函数可以完成这个功能,我更喜欢使用现成的库函数而不是自己编写小型实用程序。 - Alex
3个回答

14

使用commons-langNumberUtils.createInteger()方法:

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

1
谢谢,我在查看类时错过了它。对于布尔值,由于某种原因,它有一个不同的方法名称,即BooleanUtils.toBooleanObject()。 - Alex

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

触摸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))); 

4
我承认,Java 8 开始让我感到有点害怕 :) 我真的不想看到这被几乎合格的开发人员所使用。 - eis
有趣的是,这里还没有Java 8,看起来是一种完全不同的思考方式 - 我还不确定我是否喜欢它。基本上同意eis的观点。 - Alex
@eis 上下文很重要:但基本上,Java 8中可能返回null的“get”正在变得不好。如果有一个?:或OrElse运算符,也许不是这样。 (顺便说一句,JavaScript真的很可怕,看看jQuery的内部。使用未定义的返回值和其他细节。) - Joop Eggen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接