Создание массива при передаче его в качестве аргумента в 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 ответа:
Вы можете попробовать с
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 } }