Объявление объекта ArrayList как окончательного для использования в файле констант - PullRequest
28 голосов
/ 15 февраля 2012

Я генерирую ArrayList объектов. Ниже приведен код

ArrayList someArrayList = new ArrayList();

Public ArrayList getLotOfData()
{
ArrayList someData = new ArrayList();
return someData; 
}


someArrayList = eDAO.getLotOfData();

Как только у меня появится объект ArrayList "someArrayList", я хотел бы объявить его открытым и окончательным и сохранить его в файле констант, чтобы к нему можно было обращаться глобально. Есть ли способ, которым я могу сделать это? Если я объявлю объект Arraylist общедоступным и окончательным, то я не смогу переназначить ему какие-либо значения. Я попробовал следующее

public final ArrayList anotherArrayList = new ArrayList();

anotherArrayList.addAll(someArrayList);

Я надеялся сохранить этот "anotherArrayList" как глобальный объект ArrayList и использовать его, но это возвращает исключение нулевого указателя. Я хочу использовать его как строковую константу "ConstantsFile.anotherArrayList". Есть идеи ???

Ответы [ 3 ]

69 голосов
/ 15 февраля 2012

Вы можете легко сделать это public static final, но это не остановит людей от изменения содержимого .

Наилучшим подходом является безопасная публикация «константы» с помощью:

  • , оборачивая ее в неизменяемый список
  • с использованием блока экземпляразаполнить его

Результатом является одно аккуратное окончательное объявление с инициализацией:

public static final List<String> list = Collections.unmodifiableList(
    new ArrayList<String>() {{
        add("foo");
        add("bar");
        // etc
    }});

или аналогичный, но другой стиль для простых элементов (которым не нужен код)

public static final List<String> list = 
    Collections.unmodifiableList(Arrays.asList("foo", "bar"));
24 голосов
/ 15 февраля 2012

Гуава предоставляет ImmutableList только по этой причине.(Кроме того, у него нет ненужных служебных данных, выделяемых ArrayList, чтобы освободить место для будущих элементов, которые вы не добавите для своего приложения.)

public static final ImmutableList<String> CONSTANTS = 
  ImmutableList.of("foo", "bar");
20 голосов
/ 15 февраля 2012

Java 1.4-совместимый способ:

public static final List STRINGS = Collections.unmodifiableList(
    Arrays.asList(new String[] {"foo", "bar"}));

Такой список нельзя изменить, вызов методов, таких как add(), remove() или set(), вызовет UnsupportedOperationException.

Дляменее древние версии Java:

public static final List<String> STRINGS = Collections.unmodifiableList(
    Arrays.asList("foo", "bar"));

И, наконец, Java 9 поставляется с:

public static final List<String> STRINGS = List.of("foo", "bar");
...