Создание массива при передаче его в качестве аргумента в Java


Существует ли способ создать массив объектов как часть конструктора или метода? Я действительно не знаю, как это выразить, поэтому я включил пример. У меня есть перечисление, и одно из полей-это массив чисел. Вот что я попробовал:

public enum KeyboardStuff {

    QWERTY(1, {0.5f, 1.3f, 23.1f}, 6);
    DVORAK(5, {0.1f, 0.2f, 4.3f, 1.1f}, 91);
    CHEROKEE(2, {22.0f}, 11);

    private int number, thingy;
    private float[] theArray;

    private KeyboardStuff(int i, float[] anArray, int j) {
        // do things
    }

}
Компилятор говорит, что скобки {} недопустимы и должны быть удалены. Есть ли способ передать массив в качестве аргумента, не создавая предварительно массив объектов?
4 10

4 ответа:

Вы можете попробовать с new float[] { ... }.

public enum KeyboardStuff {

    QWERTY(1, new float[] {0.5f, 1.3f, 23.1f}, 6);
    DVORAK(5, new float[] {0.1f, 0.2f, 4.3f, 1.1f}, 91);
    CHEROKEE(2, new float[] {22.0f}, 11);

    private int number, thingy;
    private float[] theArray;

    private KeyboardStuff(int i, float[] anArray, int j) {
        // do things
    }

}

Следуя предложению @ Dave, я бы использовал vararg

QWERTY(1, 6, 0.5, 1.3, 23.1);
DVORAK(5, 91, 0.1, 0.2, 4.3, 1.1);
CHEROKEE(2, 11, 22.0);

private final int number, thingy;
private final double[] theArray;

private KeyboardStuff(int number, int thingy, double... theArray) {
    // do things
}

Довольно редко бывает, что использование float лучше, чем использование double. double имеет меньшую ошибку округления и использует только 4 байта больше.

Есть ли способ передать массив, не создавая его?

Нет, но вы можете использовать varargs, чтобы сделать его в основном невидимым, хотя это int в конце может понадобиться для перемещения.

Если использование списков вместо массивов является опцией, будущие версии Java могут начать поддерживать синтаксис " литералов коллекции ", который, к сожалению, не попал в Java 8:

public enum KeyboardStuff {

    QWERTY(1, [0.5f, 1.3f, 23.1f], 6);
    DVORAK(5, [0.1f, 0.2f, 4.3f, 1.1f], 91);
    CHEROKEE(2, [22.0f], 11);

    private int number, thingy;
    private List<Float> values;

    private KeyboardStuff(int i, List<Float> values, int j) {
        // do things
    }

}