Упростите код и избегайте проверки instanceOf и null - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу упростить код (например, с помощью 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();
}

значение может быть: null, String, Date

Ответы [ 4 ]

6 голосов
/ 08 апреля 2019

Я бы справился с перегрузкой:

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 голосов
/ 08 апреля 2019

Если вы действительно хотите функциональную версию своего кода, вы можете сделать это (используя 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);
}

Это трудно прочитать, хотя; так что я бы лично сохранил твою оригинальную версию.

1 голос
/ 08 апреля 2019

Вы можете использовать Optional из Java 8:

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);
0 голосов
/ 08 апреля 2019

Для Date в качестве Date или String нельзя избежать instanceOf. Так как ноль не Дата:

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

A Object::toString будет безопаснее, но теперь исключение при быстром сбое будет создаваться для ошибочных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...