简化代码并避免实例和空检查



我想简化代码(例如通过使用 Optionals(

private String formatValue(Object value) {
    if (value == null) {
        return null;
    } else if (value instanceof Date) {
        return MyUtils.formatDate((Date)value, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS);
    }
    return value.toString();
}

值可以是:nullStringDate

我会用重载来处理它:

private String formatValue(String value) {
    return value;
}
private String formatValue(Date value) {
    return MyUtils.formatDate(value, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS);
}

。并修复null传递它的任何代码。

如果你真的必须处理null,那么:

private String formatValue(String value) {
    return value;
}
private String formatValue(Date value) {
    return value == null ? null : MyUtils.formatDate(value, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS);
}

上述工作提供了你在编译时知道你传入的内容的类型,通常是这种情况。但是,如果您必须处理编译时唯一已知的类型是 Object 的可能性,您也可以添加一个Object版本:

private string formatValue(Object value) {
    if (value instanceof Date) {
        return this.formatValue((Date)value);
    }
    return value == null ? null : value.toString();
}

这开始感觉像更多的代码,但它允许正常路径(类型已知(直接进入适当的方法,并且只有在处理动态内容时才会提供此方法Object

或者你可以拥有Object版本。它的检查并不少,但对我来说似乎更简单、更清晰。

如果你真的想要代码的功能版本,你可以这样做(使用 2 个可选(:

private String formatValue(Object value) {
    return Optional.ofNullable(value)
            .map(v -> Optional.of(v)
                        .filter(d -> d instanceof Date)
                        .map(d -> MyUtils.formatDate((Date) d, 
                                      Constant.DATE_FORMAT_YYYYMMDD_HHMMSS))
                        .orElseGet(() -> v.toString()))
            .orElse(null);
}

不过,这很难阅读;所以我个人会保留你的原始版本。

您可以使用

java 8 中的Optional

return Optional.ofNullable(value).filter(v -> v instanceof Date || v instanceof String)
    .map(v -> v instanceof Date ? MyUtils.formatDate((Date)v, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS : v)
    .orElse(null);

对于日期作为日期或字符串之一,无法避免实例。由于 null 不是日期:

if (value instanceof Date) {
    value = MyUtils.formatDate((Date)value, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS);
}
return Optional.ofNullable(value).map(String.class::cast);

Object::toString会更安全,但现在会在错误值上引发快速故障强制转换异常。

相关内容

  • 没有找到相关文章

最新更新