Java 涉及的静态字段的值更改后,布尔值仍为false
在我的作业中,我必须使用Java 涉及的静态字段的值更改后,布尔值仍为false,java,enums,static,boolean,enumset,Java,Enums,Static,Boolean,Enumset,在我的作业中,我必须使用enum来制作符合给定标准的EnumSet。因此,代码需要尽可能灵活,并允许应用于enum中声明的对象的任何条件 我一直在测试,我的代码涉及到将enum的最后一个放入静态上下文,这样就可以对它们应用布尔值,然后循环遍历enum中的每个声明对象,以查看它们是否符合标准。但是,由于某种原因,当静态字段的值符合条件时,boolean的状态不会更改为true 这是我的密码: public class test { // enumeration of persons by age
enum
来制作符合给定标准的EnumSet
。因此,代码需要尽可能灵活,并允许应用于enum
中声明的对象的任何条件
我一直在测试,我的代码涉及到将enum
的最后一个放入静态上下文,这样就可以对它们应用布尔值,然后循环遍历enum
中的每个声明对象,以查看它们是否符合标准。但是,由于某种原因,当静态字段的值符合条件时,boolean
的状态不会更改为true
这是我的密码:
public class test {
// enumeration of persons by age and sex
enum Name {
Adam("Male", 17),
Amy("Female", 24),
Boris("Male", 12),
Bella("Female", 16);
final String _sex;
final int _age;
// static variants to "turn" values to the static context
volatile static String sex = "";
volatile static int age = 0;
Name(String sex, int age) {
_sex = sex;
_age = age;
}
}
public static void main(String[] args) {
// creating a set of people older than 17
EnumSet<Name> set = makeSet(Name.age >= 17);
System.out.print(set.toString());
}
static EnumSet<Name> makeSet(boolean query) {
EnumSet<Name> set = EnumSet.noneOf(Name.class);
for (Name element : Name.values()) {
// this is the "turning" of the values to the static context
Name.sex = element._sex;
Name.age = element._age;
// PROBLEM LIES HERE
// the query remains false, even when age is above 17
if (query) {
set.addAll(EnumSet.of(element));
}
}
return set;
}
}
公共类测试{
//按年龄和性别列出的人数
枚举名{
亚当(“男”,17岁),
艾米(“女”,24岁),
鲍里斯(“男”,12岁),
贝拉(“女性”,16岁);
最后一串(性别),;
最终国际年龄;
//静态变量将值“转换”到静态上下文
挥发性静态字符串性别=”;
易失性静态积分=0;
名称(字符串性别、整数年龄){
_性别=性别;
_年龄=年龄;
}
}
公共静态void main(字符串[]args){
//创建一组17岁以上的人
EnumSet=makeSet(Name.age>=17);
System.out.print(set.toString());
}
静态枚举集生成集(布尔查询){
EnumSet=EnumSet.noneOf(Name.class);
对于(Name元素:Name.values()){
//这是将值“转向”到静态上下文
Name.sex=元素。\u sex;
Name.age=元素。\u age;
//问题就在这里
//即使年龄在17岁以上,查询仍然为假
如果(查询){
set.addAll(EnumSet.of(element));
}
}
返回集;
}
}
将静态字段更改为volatile也不能解决问题,因此我认为这不是缓存问题那么,为什么布尔值不更新?是否有解决方案?
提前谢谢 您面临的问题是在函数调用时检查谓词(Name.age>=17
):
当您调用makeSet(Name.age>=17)
时,实际发生的是谓词
返回一个布尔值,在检查时返回false
,因此false
被解析到函数中。在@Turing85的注释中回答
出现此问题的原因是正在按值传递布尔值。
使用谓词
而不仅仅是布尔值
修复了该问题,因为对象引用将被传递,从而允许在调用makeSet()
方法后更改值
此外,这样就不需要将enum
的最后部分放入静态上下文中
这是我现在的代码:
public class test {
// enumeration of persons by age and sex
enum Name {
Adam("Male", 17),
Amy("Female", 24),
Boris("Male", 12),
Bella("Female", 16);
final String sex;
final int age;
Name(String sex, int age) {
this.sex = sex;
this.age = age;
}
}
public static void main(String[] args) {
// creating a set of people older than 17
EnumSet<Name> set = makeSet(query -> query.age >= 17);
System.out.print(set.toString());
}
static EnumSet<Name> makeSet(Predicate<Name> query) {
EnumSet<Name> set = EnumSet.noneOf(Name.class);
for (Name element : Name.values()) {
// PROBLEM FIXED
if (query.test(element)) {
set.addAll(EnumSet.of(element));
}
}
return set;
}
}
公共类测试{
//按年龄和性别列出的人数
枚举名{
亚当(“男”,17岁),
艾米(“女”,24岁),
鲍里斯(“男”,12岁),
贝拉(“女性”,16岁);
最后一串性别;
最终积分;
名称(字符串性别、整数年龄){
这个。性=性;
这个。年龄=年龄;
}
}
公共静态void main(字符串[]args){
//创建一组17岁以上的人
EnumSet=makeSet(query->query.age>=17);
System.out.print(set.toString());
}
静态枚举集生成集(谓词查询){
EnumSet=EnumSet.noneOf(Name.class);
对于(Name元素:Name.values()){
//问题解决了
if(query.test(元素)){
set.addAll(EnumSet.of(element));
}
}
返回集;
}
}
您在混搭:volatile在多线程上下文中很有用,这显然不是您的用例。因此,您可以删除该位,它在这里什么都不做。boolelanvaluequery
只是:一个布尔值,而不是一个可以应用于某个给定名称的谓词。如果我们想要有这样一个谓词,我们将传递一个谓词类型的参数,例如.makeSet(name->name.age>=17)
。我不理解静态字段name
和sex
后面的比率。你能解释一下你为什么需要它们吗?@Turing85没有关系,我可以把enum
也识别为Person
,这可能会更清楚。无论如何,您使用谓词的想法奏效了,谢谢!