繁体   English   中英

Java 中枚举内的 EnumSet 修饰符

[英]EnumSet modifiers inside an enum in Java

使用修饰符staticfinal在枚举中声明 EnumSet 是否有意义? 或者是多余的?

例子:

public enum Guitar {
    STRATOCASTER,
    LES_PAUL,
    CLASSIC;

    private static final EnumSet electrics = EnumSet.of(STRATOCASTER, LES_PAUL);
}

谢谢!

使用修饰符 static 和 final 在枚举中声明 EnumSet 是否有意义? 或者是多余的?

不,它们不是多余的。 考虑以下示例,其中可以设置nonElectrics ,因为它不是final

import java.util.EnumSet;

enum Guitar {
    STRATOCASTER, LES_PAUL, CLASSIC;

    private static final EnumSet<Guitar> electrics = EnumSet.of(STRATOCASTER, LES_PAUL);
    static EnumSet<Guitar> nonElectrics = EnumSet.of(CLASSIC);

    public static EnumSet<Guitar> getNonElectrics() {
        return nonElectrics;
    }

    public static void setNonElectrics(EnumSet<Guitar> nonElectrics) {
        Guitar.nonElectrics = nonElectrics;
    }

    public static EnumSet<Guitar> getElectrics() {
        return electrics;
    }

    public boolean isElectronics() {
        return electrics.contains(this);
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Guitar.STRATOCASTER.isElectronics());
        System.out.println(Guitar.CLASSIC.isElectronics());
        EnumSet<Guitar> electrics = EnumSet.of(Guitar.STRATOCASTER, Guitar.LES_PAUL);
        Guitar.setNonElectrics(electrics);
        System.out.println(Guitar.getNonElectrics());
    }
}

这不是多余的,枚举 class 中的字段不是 static 或最终字段。 但是,您不能从其他类调用非 static 枚举字段。

tl;博士

static final public Set ELECTRICS = Set.of( STRATOCASTER , LES_PAUL ) ;

细节

关于您的代码:

private static final EnumSet electrics = EnumSet.of(STRATOCASTER, LES_PAUL);

private

正如所写,不需要private

如果标记为private ,则没有其他代码可以访问此集合。 所以它没有任何意义。

static

是的, static是合适的。 枚举定义了其 class 的特定数量的命名实例。 当 class 在运行时首次加载时,实例化会自动发生。 所以每个枚举 object 都是一个单独的 object。 不需要他们每个人都有自己的一套。 该集合是不变的,因此只需通过将其标记为static来定义该集合的单个实例。

这使得语法更加清晰,因为我们不涉及任何名称的枚举对象。 示例代码:

Set < Guitar > guitars = Guitar.ELECTRICS ; 

或者:

Guitar.ELECTRICS.stream.forEach( System.out::println ) ;

final

是的,如果此设置在此应用程序的整个运行过程中保持不变,请将其标记为final 标记为final可防止将任何其他集合分配给该字段。

枚举集EnumSet Set

关于第一个EnumSet ,简单地设置为Set

一般来说,promise 最好是一个更通用的超类或接口,而不是将自己锁定在特定的具体 class 中。

electricsELECTRICS

如果您打算将此设置固定不变,则名称electrics应全部大写。 按照惯例,Java 中的常量全部大写。 所以, ELECTRICS

集合的复数命名

很好,你以复数形式命名了ELECTRICS 这个名字表明它是一个集合而不是一个单一的枚举 object。

Set.of用于不可修改的集合

至于第二个EnumSet ,一般使用EnumSet是处理枚举对象的正确选择。 EnumSet class 针对枚举进行了高度优化,从而在使用非常少的 memory 的同时实现非常快的性能。

但这里的问题是EnumSet是可变的。 我希望您不希望任何错误的代码从您的集合中添加或删除元素。

所以我们想要一个不可变的集合。 Java 通过Set.of…方法提供了一个不可修改的集合

在幕后,这些方法可以自由使用他们想要的任何具体 class,因此可以自由优化底层 class 的选择。 因此,您最终可能会得到一个有效的具体 class ,例如EnumSet 但这并不是最重要的,因为在这种情况下,不变性胜过性能。

解决方案代码

所以我会把这段代码写成:

static final public Set ELECTRICS = Set.of( STRATOCASTER , LES_PAUL ) ;

第三方库中显式不可变 collections

使用Set.of的另一种方法是向您的项目添加一个库,该库提供不变性作为其集合数据类型的显式部分。 也许Eclipse CollectionsGoogle Guava

至于冗余,请参阅Live 和 Let Live 的正确答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM