0

我有一段简单的代码:

txtRequiredDate.setText(wwDateFormatter.format(todoEntity.getRequiredDate()));
txtRequiredDateDay.setText(dayOfWeek(todoEntity.getRequiredDate()));
txtDoneDate.setText(wwDateFormatter.format(todoEntity.getDoneDate()));
txtDoneDateDay.setText(dayOfWeek(todoEntity.getDoneDate()));

问题是有时日期为空(因为它是可选的填写)。在这些情况下,wwDateFormatter 会触发 NullPointerException。

正如我所见,修复它的一种方法是:

if (todoEntity.getRequiredDate() != null) 
{
    txtRequiredDate.setText(wwDateFormatter.format(todoEntity.getRequiredDate()));
    txtRequiredDateDay.setText(dayOfWeek(todoEntity.getRequiredDate()));
}

if (todoEntity.getDoneDate() != null)
{
    txtDoneDate.setText(wwDateFormatter.format(todoEntity.getDoneDate()));
    txtDoneDateDay.setText(dayOfWeek(todoEntity.getDoneDate()));
}

但我想知道是否有更简洁的方式来编写上述语句?

谢谢你!

编辑我想这不是没有优化,而是我想学习各种检查空值的方法,特别是如果出现我必须有 30 个这样的语句的情况,呵呵。

4

3 回答 3

3

为什么不用 null 感知变体包装格式化程序,如果传递 null 则返回空字符串?

您可能还对空对象模式感兴趣。另请注意此博客,其中讨论了 Scala 的Option模式和 Java 中的等价模式。这些都是非常有用的模式,您可以利用它们来缓解上述问题。

于 2012-06-26T13:43:44.983 回答
2

确保您的日期字符串永远不会为空(使用空字符串:""代替) - 不再需要 ifs。

或者您可以使用非空实用程序方法(类似于 Brian 建议的):

private String nonNull(String s) {
    return (s == null ? "" : s);
}

public void yourMethod() {
    txtRequiredDate.setText(wwDateFormatter.format(nonNull(todoEntity.getRequiredDate())));
    txtRequiredDateDay.setText(dayOfWeek(nonNull(todoEntity.getRequiredDate())));
    ...
}
于 2012-06-26T13:42:18.707 回答
2

这是访问器/属性最好避免的典型原因。尝试摆脱暴露实体的“原始”数据并将逻辑放入实体本身 - 然后您将空检查放在一个地方。

txtRequiredDate.setText(todoEntity.formattedRequiredDate())

...您在实体方法中进行空检查(并返回空字符串或任何如果为空)。

Whether getters and setters really are evil or not, old classic article in this subject, is up for debate, but at least having encapsulation in mind when designing entities is a good thing IMO.

于 2012-06-26T14:03:07.113 回答