28
Мар
2018

Дженерики чтобы избавиться от повтора кода

Есть Set принимающий в конструкторе массив Numbers и метод summator который складывает все числа из коллекции. Меня смущает, что код для суммирования повторяется... можно ли как то эту задачу решить красивее... возможно с помощью дженериков? Я попробовал написать обобщенный код и параметизировать класс, но в таком виде это также не работает

/*
T sum = null;
for (T element : setNumbers)
    sum += element;
return sum;
*/

Или нельзя в принципе тут использовать дженерики? и нужно искать красивое решение в работе с Collections или стрим апи, лямбды какие-нибудь.... Подскажите направление хотя бы. Привожу свой код...

private Set<Number> numbers;
private Class type;

public MathBox(Number[] numbers){
    if (numbers[0] instanceof Integer) this.type = Integer.class;
    if (numbers[0] instanceof Long) this.type = Long.class;
    if (numbers[0] instanceof Double) this.type = Double.class;
    if (numbers[0] instanceof Float) this.type = Float.class;

    this.numbers = new HashSet(Arrays.asList(numbers));
}

public Number summator() {
    if (type == Integer.class) {
        Integer sum = 0;
        for (Number element : numbers)
            sum += (Integer) element;
        return sum;
    }

    if (type == Long.class) {
        Long sum = 0L;
        for (Number element : numbers)
            sum += (Long) element;
        return sum;
    }

    if (type == Double.class) {
        Double sum = 0.0;
        for (Number element : numbers)
            sum += (Double) element;
        return sum;
    }

    if (type == Float.class) {
        Float sum = 0.0F;
        for (Number element : numbers)
            sum += (Float) element;
        return sum;
    }
    return null;
}

Источник: https://ru.stackoverflow.com/questions/805740/%D0%94%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D0%BA%D0%B8-%D1%87%D1%82%D0%BE%D0%B1%D1%8B-%D0%B8%D0%B7%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%D1%81%D1%8F-%D0%BE%D1%82-%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%B0-%D0%BA%D0%BE%D0%B4%D0%B0

Тебе может это понравится...

Добавить комментарий