![](/img/trans.png)
[英]Java - EnumSet.add(enum), throws NullPointerException
[英]EnumSet modifiers inside an enum in Java
使用修饰符static
和final
在枚举中声明 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 枚举字段。
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 中。
electrics
➠ ELECTRICS
如果您打算将此设置固定不变,则名称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 ) ;
使用Set.of
的另一种方法是向您的项目添加一个库,该库提供不变性作为其集合数据类型的显式部分。 也许Eclipse Collections或Google Guava 。
至于冗余,请参阅Live 和 Let Live 的正确答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.