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在多线程上下文中很有用,这显然不是您的用例。因此,您可以删除该位,它在这里什么都不做。
boolelan
value
query
只是:一个
布尔值,而不是一个可以应用于某个给定
名称的谓词。如果我们想要有这样一个谓词,我们将传递一个
谓词类型的参数,例如
.makeSet(name->name.age>=17)
。我不理解静态字段
name
sex
后面的比率。你能解释一下你为什么需要它们吗?@Turing85没有关系,我可以把
enum
也识别为
Person
,这可能会更清楚。无论如何,您使用
谓词
的想法奏效了,谢谢!