java – 我应该如何为类的每个实例声明一个可见的常量集?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 我应该如何为类的每个实例声明一个可见的常量集?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5019字,纯文字阅读大概需要8分钟。
内容图文
![java – 我应该如何为类的每个实例声明一个可见的常量集?](/upload/InfoBanner/zyjiaocheng/764/5624c5dce6c745bc9900b16df629e536.jpg)
我希望在我的班级中有一个常量集,这对于班级的所有实例都是可见的.
首先,我不知道是否需要将其声明为“静态”.据我所知,其他实例将看到静态字段的任何更改(由其中一个实例完成)(因此静态变量未绑定到特定实例).而且,静态字段可以在不使用任何实例的情况下进行更改(我们直接使用该类).因此,静态字段的所有这些特殊属性都与它的更改方式以及这些更改的影响有关.但在我的情况下,我希望有一个常数(所以“变化”问题在这里不相关).所以,我可能不需要使用“静态”.对?
其次,我的集合将包含很多元素,我不想一次定义集合的值(当我创建变量时).换句话说,我想声明一个集合,然后逐步向该集合添加元素.但是,如果我使用常量,我就无法做到.是否可以指定集合的??值,然后使其保持不变?
第三,我已经意识到,如果我尝试在任何方法之外更改变量的值,可能会出现一些问题.那么它是怎样工作的?
添加:
好.由于答案,我理解它应该是“final”和“static”(因为它是一个常量集,并且它不会与任何特定实例相关联,它应该对该类的所有实例都可见).但是我还是有问题.我想使用“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. fillSet中的SomeType()是什么?这种方法有什么作用?
3. fillSet做什么?稍后在示例中,我们为此方法提供一个空集.做什么的?
4.我们将tempSet声明为final是什么?
5.究竟不可修改的Set究竟是什么?根据名称,它生成了一个无法修改的集合,我想.但是为什么将yourSetField声明为final是不够的呢?比它也不变.
解决方法:
是否要将元素添加到集合中,然后只读取其内容,或者您??是否希望能够随时向其中添加元素?如果您创建一次,请执行以下操作:
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 = Collections.unmodifiableSet(tempSet);
}
}
现在 – 它是私人的,所以你班外的人都无法访问它.而且它不可修改,所以没有人可以改变它的内容.
如果你想随时添加元素,你会遇到并发问题 – 阅读extraneon的答案.
编辑
根据要求,我解释了这段代码的作用.
首先 – 神秘<>括号:
我假设您使用的是Java 1.5或更高版本并使用了generics.简而言之 – 如果您声明一个List类型的变量,它将保存对象.如果您希望将字符串保留在其中,则必须在从列表中检索字符串时将其强制转换.例
List myList = new ArrayList();
myList.add("Hello, my Jon Skeet Number decreases");
String firstElement = (String) myList.get(0);
需要转换为String.此外,没有什么可以阻止您将BigDecimal添加到myList.但是如果你检索它并尝试强制转换为String,则会得到ClassCastException.
myList.add(0, BigDecimal.ZERO); // perfectly legal
String anotherString = (String) myList.get(0); // compiles, but ClassCastException at runtime
所以Java 1.5引入了泛型.您可以指定,List只能包含字符串.语法使用<>括号:
List<String> myList = new ArrayList<String>();
myList.add("Hi everybody");
String firstElem = myList.get(0); // no cast required
myList.add(BigDecimal.ZERO); // compiler error: cannot cast BigDecimal to String
同样适用于其他集合,例如集合.我写了关于列表的内容,因为从列表中检索更方便.我在我的例子中使用了SomeType,因为我不知道你想要保留在你的Set中.您应该将其替换为您要存储的对象类型.
现在 – 静态块.初始化静态字段有两种方法 – 直接在它们的声明中:
static private int instanceCount = 0;
如果初始值是简单表达式,这将非常有用.
或者在静态初始化块中
static {
// some code, that can use class static variables, class static methods, declare its own variables etc.
}
如果某些静态字段的初始值需要更复杂的计算,这很有用.
现在你的问题
>使用fillSet的参数集.添加了一个元素:set.add(new SomeType());
>由于我不知道你想要保留在你的集合中,我将其元素的类型命名为SomeType.它将替换为您要使用的类型. new SomeType();创建一个(假设的)SomeType实例,调用其无参数构造函数.
> fillSet完全符合其名称的含义 – 获取一个集合并填充它(为它添加一些值).我们给它一个空集,以便结果我们得到一个包含fillSet放入的元素的集合. fillSet是一个你应该放置初始化你的集合的代码的地方.把它分开是件好事.
> tempSet是静态初始化块中的局部变量,它被分配一次并且从不重新分配.为了表达这一点,我宣布它是最终的.这是我使用findBugs的习惯,我认为它对可读性有好处.
>使yourSetField成为最终意味着一旦初始化你就无法编写yourSetField = new HashSet< SomeType>().但是任何可以访问yourSetField的人都可以编写yourSetField.add(…).如果yourSetField是一个不可修改的Set,添加它将在运行时导致异常(UnsupportedOperationException).换句话说:final意味着你不能让你的setField指向另一个对象(并且编译器保证它). unmodifiableSet表示您无法在集合中添加或删除对象.它将编译但会在运行时中断.
内容总结
以上是互联网集市为您收集整理的java – 我应该如何为类的每个实例声明一个可见的常量集?全部内容,希望文章能够帮你解决java – 我应该如何为类的每个实例声明一个可见的常量集?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。