Объявление объекта ArrayList как final для использования в файле констант
Я создаю ArrayList объектов.
Ниже приведен код
ArrayList someArrayList = new ArrayList();
Public ArrayList getLotOfData()
{
ArrayList someData = new ArrayList();
return someData;
}
someArrayList = eDAO.getLotOfData();
Как только у меня есть этот объект ArrayList "someArrayList", я хотел бы объявить его общедоступным и окончательным и сохранить его в файле Constants, чтобы он мог получить доступ во всем мире.
Есть ли способ, которым я могу это сделать? Если я объявлю объект Arraylist общедоступным и окончательным, то я не смог бы переназначить ему какие-либо ценности.
Я попробовал следующее
public final ArrayList anotherArrayList = new ArrayList();
anotherArrayList.addAll(someArrayList);
Я надеялся сохранить этот "anotherArrayList" в качестве глобального объекта ArrayList и использовать его, но это возвращает исключение nullpointer. Я хочу использовать его точно так же, как константа String "ConstantsFile.anotherArrayList". Любые идеи???
Ответы
Ответ 1
Guava предоставляет ImmutableList
для просто об этом причина. (Кроме того, у него нет лишних служебных данных, которые ArrayList
выделяет, чтобы освободить место для будущих элементов, которые вы не будете добавлять для своего приложения.)
public static final ImmutableList<String> CONSTANTS =
ImmutableList.of("foo", "bar");
Ответ 2
Вы можете легко сделать это 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"));
Ответ 3
Совместимость с 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");