Я хотел бы иметь постоянный набор в моем классе, который будет виден для всех экземпляров класса.Как объявить постоянный набор, видимый для каждого экземпляра класса?
Во-первых, я не знаю, нужно ли объявлять его как «статический». Насколько я понимаю, любые изменения статического поля (сделанные одним из экземпляров) будут рассматриваться другими экземплярами (поэтому статическая переменная не привязана к конкретному экземпляру). Более того, статическое поле может быть изменено без использования какого-либо экземпляра (мы работаем непосредственно с классом). Таким образом, все эти специальные свойства статического поля связаны с тем, как его можно изменить и каковы последствия этих изменений. Но в моем случае я хотел бы иметь константу (поэтому проблемы с «изменениями» здесь не актуальны). Поэтому, вероятно, мне не нужно использовать «статический». Правильно?
Во-вторых, мой набор будет содержать много элементов, и я не хочу сразу определять значение набора (когда я создаю переменную). Другими словами, я хотел бы объявить набор, а затем добавлять элементы к этому набору шаг за шагом. Но я не могу этого сделать, если я работаю с константами. Возможно ли заданное значение набора, а затем сделать его постоянным?
В-третьих, я понял, что могут возникнуть проблемы, если я попытаюсь изменить значение переменных вне любого метода. Итак, как это работает?
ДОБАВЛЕНО:
OK. Благодаря ответу я понял, что он должен быть «final» и «static» (поскольку он является постоянным, и он не будет связан с каким-либо конкретным экземпляром, он должен быть видимым для всех экземпляров класса). Однако у меня все еще есть проблема. Я хотел указать набор, используя «add», и я не могу добавить в набор, если он является постоянным (final). Более того, я не могу изменить значения переменных вне методов (почему?). Во всяком случае, я не настаиваю на использовании «add» для определения набора. Я готов сразу определить его. Но я не знаю, как это сделать. Я пробовал такие вещи:
final static Set allowedParameters = new HashSet("aaa","bbb");
final static Set allowedParameters = new HashSet(["aaa","bbb"]);
final static Set allowedParameters = new HashSet({"aaa","bbb"});
final static Set allowedParameters = new HashSet(Arrays.asList({"userName"}));
И они не работали.
ДОБАВЛЕНО 2:
Может кто-нибудь объяснить мне, мольбы, код дал Тадеуш Kopec?
class YourClass {
private static void fillSet(Set<SomeType> set) {
// here you add elements, like
set.add(new SomeType());
}
private final static Set<SomeType> yourSetField;
static {
final Set<SomeType> tempSet = new HashSet<SomeType>();
fillSet(tempSet);
yourSetField = Collection.unmodifiableSet(tempSet);
}
}
1. Метод fillSet
имеет одну переменную называется "установить". Почему он не используется в методе?
2. Что такое SomeType()
в fillSet
? Что делает этот метод?
3. Что делает fillSet
? Позже в этом примере мы даем пустой набор этому методу. Зачем?
4. Зачем мы объявляем tempSet
в качестве окончательного?
5. Что именно unmodifiableSet
делать? Я думаю, по имени он генерирует набор, который не может быть изменен. Но почему этого недостаточно, чтобы объявить yourSetField
как final
? Чем это было бы постоянно.
Когда вы говорите «set», вы имеете в виду java.util.Set >? –
«Я не хочу сразу определять значение набора». Что это значит? что вы хотите добавить в набор в будущем? – Bozho
@dbingham, Да. – Roman