Создание массива при передаче его в качестве аргумента в Java - PullRequest
16 голосов
/ 25 сентября 2011

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

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 ]

35 голосов
/ 25 сентября 2011

Вы можете попробовать с 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
    }

}
5 голосов
/ 25 сентября 2011

Следуя @ Дэйву, я бы предложил 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 байта.

2 голосов
/ 25 сентября 2011

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

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

1 голос
/ 25 сентября 2011

Если вариант использования списков вместо массивов является опцией, будущие версии Java могут начать поддерживать синтаксис « collection literal », который, к сожалению, не вошел в 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
    }

}
...