我想在我的类中设置一个常量,该常量对类的所有实例都是可见的。
首先,我不知道是否需要将其声明为“静态”。据我了解,静态字段的任何更改(由其中一个实例完成)都会被其他实例看到(因此静态变量不绑定到特定实例)。此外,可以在不使用任何实例的情况下更改静态字段(我们直接使用类)。因此,静态字段的所有这些特殊属性都与如何更改它的方式以及这些更改的效果有关。但在我的情况下,我希望有一个常数(所以“变化”问题在这里不相关)。所以,可能我不需要使用“静态”。正确的?
其次,我的集合将包含很多元素,我不想一次定义集合的值(当我创建变量时)。换句话说,我想声明一个集合,然后逐步将元素添加到这个集合中。但如果我使用常量,我就无法做到。是否可以指定集合的值然后使其保持不变?
第三,我意识到如果我尝试在任何方法之外更改变量的值,可能会出现一些问题。那么它是怎样工作的?
添加:
好的。感谢答案,我明白它应该是“最终的”和“静态的”(因为它是一个常量集并且它不会与任何特定实例相关联,它应该对类的所有实例都是可见的)。但是我仍然有问题。我想使用“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:
谁能解释一下 Tadeusz 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
方法有一个名为“set”的变量。为什么在方法中不使用它?
2. 里面有
什么?这个方法有什么作用?
3.做什么?在后面的例子中,我们给这个方法一个空集。做什么的?
4. 我们为什么要声明为 final?
5.具体是做什么的?我认为根据名称它会生成一个无法修改的集合。但是为什么声明为不够呢?比它也将是恒定的。SomeType()
fillSet
fillSet
tempSet
unmodifiableSet
yourSetField
final