0

在我的作业中,我必须使用 anenum来制作EnumSet符合给定标准的元素。因此,代码需要尽可能灵活,并允许任何可应用于enum.

我一直在进行测试,我的代码涉及将最终的 theenum放入静态上下文中,以便boolean可以将 a 应用于它们,然后循环遍历 中的每个声明的对象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;
    }
}

将静态字段更改为volatile也不能解决问题,所以我认为这不是缓存问题。那么,为什么布尔值不更新?有解决办法吗?

提前致谢!

4

2 回答 2

1

您面临的问题是predicate( Name.age >= 17) 在函数调用时被检查:

当你调用makeSet(Name.age >= 17)时,实际发生的是,predicate返回一个布尔值,在检查时返回一个布尔值,false因此false被解析到函数中。

于 2021-05-22T19:51:17.170 回答
0

@Turing85 在评论中回答

出现问题是因为boolean按值传递。使用 aPredicate而不是仅仅boolean解决问题,因为对象引用将被传递,从而允许在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;
    }
}
于 2021-05-23T13:05:11.617 回答