Рефакторинг. Как извлечь код в общий метод?

Чтобы избежать дублирования в коде, есть ли способ выделить в отдельный метод выбранный код?

class Builder
{
    private final List< UnitIf > unit = new ArrayList<>();
    private final List< TimeIf > time = new ArrayList<>();

    public Builder withUnit( final UnitIf aUnit )
    {
        //Extract to method
        if ( aUnit != null )
        {
            unit.add( aUnit );
        }
        return this;
        //----------------
    }

    public Builder withTime( final TimeIf aTime )
    {
        //Extract to method
        if ( aTime != null )
        {
            time.add( aTime );
        }
        return this;
        //----------------
    }
}

Моя цель — упростить код, устранив дублирование. Но части кода используют разные типы данных.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавить метод

public <T> Builder addIfNonNull(List<T> dst, T x)
{
    if (x != null) {
        dst.add(x);
    }   
    return this;
}

и реализуй withUnit лайк

public Builder withUnit( final UnitIf aUnit )
{
    return addIfNonNull(unit, aUnit);
}

и изменить withTime таким же образом.

Необщая версия

Если вы не хотите, чтобы это был общий метод, просто опустите параметр типа T и измените тип x на Object:

public Builder addIfNonNull(List dst, Object x)
{
    if (x != null) {
        dst.add(x);
    }   
    return this;
}

Внутри компилятор Java скомпилирует List<T> только в List. Кажется, это называется "стирание шрифта".

Это очень хорошее решение для меня. Возможно ли какое-либо решение без универсальных типов?

ArtRac 26.11.2022 15:17

Другие вопросы по теме