it-swarm.com.ru

Java-массив констант

Как можно объявить и инициализировать массив констант в Java без использования enums?

static final Type[] arrayOfConstants = new Type[10]; // not an array of constants
5
Athanasios V.

Если вы хотите создать неизменный массив, нет, вы не можете. Все массивы в Java являются изменяемыми.

Если вы просто хотите предварительно определить массив в своем классе, вы можете сделать это:

private static final int[] MY_ARRAY = {10, 20, 30, 40, 50};

Здесь мы создали предопределенный массив MY_ARRAY длиной 5, поэтому MY_ARRAY[0] равен 10 и так далее. Будьте осторожны, так как даже поле MY_ARRAY объявлено как final, это не означает, что элементы массива не могут быть изменены. Таким образом, лучше не показывать такой массив публично через модификатор public или protected.

6
Tagir Valeev

Я имею в виду, что компоненты массива должны быть константами, то есть a [0] быть константной переменной, как эта общедоступная статическая final int SIZE = 10;

Вы не можете дать имена индексов массива.

Вы можете инициализировать массив, используя значения ранее существовавших констант:

public static final int SIZE = 10;

public static final int[] CONSTANTS = { SIZE };

Имейте в виду, что хотя массив объявлен final, его значения все еще могут быть изменены. final только гарантирует, что вы не можете переназначить переменную массива, поэтому вы захотите инкапсулировать массив, чтобы предотвратить мутацию:

final class Constants {
    public static final int SIZE = 10;

    private static final int[] CONSTANTS = { SIZE };

    public static int getConstant(int index) {
       return CONSTANTS[index];
    }
}

Если вы хотите выполнить цикл, я предлагаю вернуть deep-copy массива.

2
Vince Emigh

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

static final ImmutableList<Type> arrayOfConstants = ImmutableList.of(t1, t2, t3);
1
Florin Grigoriu

-Если вы знаете значения заранее, инициализируйте значения массива и пометьте этот массив как final.

-Если вы не знаете значений изначально, напишите общедоступные методы getter/setters и объявите массив как private. Напишите логику в методе сеттера, чтобы отменить изменения, внесенные в определенный элемент (или выдать исключение при нескольких изменениях в одном и том же элементе)

0
Mustafa sabir

если final используется с объектами, вы не можете изменить ссылку на этот объект, но изменение значения совершенно нормально. Array - это объект в Java, и если вы хотите, чтобы значение объекта не изменялось после его создания, вам придется сделать объект неизменным и примитивный массив не может быть неизменным в Java.

    final int [] finalArr={5,6,8};

     System.out.println("Value at index 0 is "+finalArr[0]);    
      //output : Value at index 0 is 5

      //perfectly fine
      finalArr[0]=41;

     System.out.println("Changed value at index 0 is "+finalArr[0]);
    //Changed value at index 0 is 41

     int[] anotherArr={7,9,6};
     // finalArr=anotherArr;
     //error : cannot assign a value to final variable finalArr

Для получения дополнительной информации о неизменяемом массиве вы можете обратиться к этим ссылкам:

Неизменяемый массив в Java

Есть ли способ сделать обычный массив неизменным в Java?

0
Atul Raj

Давно пока этот пост открыт. Я удивлен, почему никто не подумал

public static final List<LanguageModel> GenderDataSource = new ArrayList<GenderModel>(){{
    add(new LanguageModel("0", "English"));
    add(new LanguageModel("1", "Hindi"));
    add(new LanguageModel("1", "Tamil"));
};};

Где LanguageModel просто содержит два свойства Id и Title или использует любой класс вашей модели универсального Type.

Должен отлично работать как постоянный.

- Н Бауа

0
NBaua