Java: множественные конструкторы, заставляющие повторное использование кода? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть класс, в котором один из его членов равен ArrayList<ArrayList<Double>> elements, и поэтому у меня есть конструктор, который принимает тот же тип, и все хорошо.

public elementArray(ArrayList<ArrayList<Double>> elements)
{
    this.elements =  elements;
    // a bunch of other stuff happens
}

Однако мне также нужно бытьв состоянии построить с вводом типа Double[][], поэтому я сначала преобразовываю его в тип списка 2D, а затем вызываю оригинальный конструктор ...

public elementArray(Double[][] array)
{
    // convert Double[][] array to ArrayList<ArrayList<Double>> elements
    this(elements);
}

Только я не могу вызвать другой конструкторкроме как первое, что происходит в моем конструкторе!Я обречен копировать-вставить здесь, или есть умный способ сделать то, что я хочу?

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Но лучше использовать список вместо ArrayList.

    public elementArray(Double[][] array) {
        this(convert(elements));
    }

    static ArrayList<ArrayList<Double>> convert(Double[][] elements) {
        return IntStream.range(0, elements.length)
                .mapToObj(i -> IntStream.range(0, elements[i].length)
                        .mapToObj(j -> elements[i][j])
                        .collect(ArrayList::new, List::add, (u, v) -> u.addAll(v)))
                .collect(ArrayList::new,
                        (u, v) -> v.add(u),
                        (u, v) -> u.addAll(v));
    }
0 голосов
/ 23 октября 2018

Вы не можете иметь код перед вызовом this(), вы также не можете вызывать другие методы экземпляра.

Вы можете извлечь это преобразование в отдельный статический метод:

private static ArrayList<ArrayList<Double>> arrayToList(Double[][] d) {
    //convert and return list
}

И повторно используйте этот метод во втором конструкторе:

public elementArray(Double[][] array) {
    this(arrayToList(array));
}
0 голосов
/ 23 октября 2018

Обычным шаблоном будет использование вместо этого Builder.

https://iluwatar.github.io/java-design-patterns/patterns/builder/

Или статический фабричный метод.

https://iluwatar.github.io/java-design-patterns/patterns/factory-method/

Например, используя статический метод фабрики, у вас будет только один (возможно, закрытый) конструктор, который принимает самую чистую версию того, что нужно вашему классу.

public class elementArray{
    public elementArray(ArrayList<ArrayList<Double>> elements)
    {
        this.elements =  elements;
        // a bunch of other stuff happens
    }
    public static elementArray create(Double[][] array)
    {
        // convert Double[][] array to ArrayList<ArrayList<Double>> elements
        return new elementArray(elements);
    }
    public static elementArray create(ArrayList<ArrayList<Double>> elements)
    {
        return new elementArray(elements);
    }
}

, а затем, вместо вызова конструктора,вы бы вызвали статические методы.

elementArray.create(new double[][]{{1.0d},{2.0d}});

Это довольно часто использовалось в недавней Java, в Гуаве и стандартной библиотеке Java.

см. Arrays.asList https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList-T...-

0 голосов
/ 23 октября 2018

Одним из решений было бы извлечь преобразование в статический метод:

public elementArray(Double[][] array) {
    this(convert(elements));
}

private static ArrayList<ArrayList<Double>> convert(Double[][] array) {
    // convert Double[][] array to ArrayList<ArrayList<Double>> elements
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...