我有以下示例:
import java.util.EnumSet;
import java.util.Iterator;
public class SizeSet {
public static void main(String[] args) {
EnumSet largeSize = EnumSet.of(Size.XL,Size.XXL,Size.XXXL);
for(Iterator it = largeSize.iterator();it.hasNext();){
Size size = (Size)it.next();
System.out.println(size);
}
}
}
enum Size {
S, M, L, XL, XXL, XXXL;
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我可以理解Enum创建了一个Enum类型的大小.
我的问题是:是largeSizeEnumSet类型的对象吗?它到底意味着什么?我真的想更好地理解它.
我维护一个大型文档存档,我经常使用位字段来记录处理期间或验证文档时的状态.我的遗留代码只使用静态int常量,例如:
static int DOCUMENT_STATUS_NO_STATE = 0
static int DOCUMENT_STATUS_OK = 1
static int DOCUMENT_STATUS_NO_TIF_FILE = 2
static int DOCUMENT_STATUS_NO_PDF_FILE = 4
Run Code Online (Sandbox Code Playgroud)
通过设置适当的标志,可以很容易地指示文档所处的状态.例如:
status = DOCUMENT_STATUS_NO_TIF_FILE | DOCUMENT_STATUS_NO_PDF_FILE;
Run Code Online (Sandbox Code Playgroud)
由于使用静态常量的方法是不好的做法,并且因为我想改进代码,所以我希望使用Enums来实现相同的目标.有一些要求,其中之一是需要将状态作为数字类型保存到数据库中.因此需要将枚举常量转换为数值.以下是我的第一种方法,我想知道这是否是正确的方法呢?
class DocumentStatus{
public enum StatusFlag {
DOCUMENT_STATUS_NOT_DEFINED(1<<0),
DOCUMENT_STATUS_OK(1<<1),
DOCUMENT_STATUS_MISSING_TID_DIR(1<<2),
DOCUMENT_STATUS_MISSING_TIF_FILE(1<<3),
DOCUMENT_STATUS_MISSING_PDF_FILE(1<<4),
DOCUMENT_STATUS_MISSING_OCR_FILE(1<<5),
DOCUMENT_STATUS_PAGE_COUNT_TIF(1<<6),
DOCUMENT_STATUS_PAGE_COUNT_PDF(1<<7),
DOCUMENT_STATUS_UNAVAILABLE(1<<8);
private final long statusFlagValue;
StatusFlag(long statusFlagValue) {
this.statusFlagValue = statusFlagValue;
}
public long getStatusFlagValue(){
return statusFlagValue;
}
}
/**
* Translates a numeric status code into a Set of StatusFlag enums
* @param numeric statusValue
* @return …Run Code Online (Sandbox Code Playgroud) 我正在努力使用EnumSet,因为它令人惊讶地没有一个简单的构造函数,并且它的方法不喜欢null值.
我想出了什么:
EnumSet<MyClass> x = EnumSet.copyOf(Collections.<MyClass>emptySet());
这有点有效,但对我来说似乎不对.
在浏览EnumSet<E> of方法时,我看到了多个of方法的重载实现:
public static <E extends Enum<E>> EnumSet<E> of(E e)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2)
.
.
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)
Run Code Online (Sandbox Code Playgroud)
然后用另一个重载方法 varargs
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
EnumSet<E> result = noneOf(first.getDeclaringClass());
result.add(first);
for (E e : rest)
result.add(e);
return result;
}
Run Code Online (Sandbox Code Playgroud)
当这个varargs可以处理其他实现时,为什么这个方法会以这种方式重载?这有什么具体原因吗?
我曾经历过同样的Javadoc,但我找不到任何令人信服的解释.
我试图用代替位掩码来代码
public static Set<Amenities> fromBitFlags(int bitFlag) {
return ALL_OPTS.stream().filter(a -> (a.ameityId & bitFlag) > 0).collect(Collectors.toSet());
}
Run Code Online (Sandbox Code Playgroud)
我想返回EnumSet而不是简单的集合(不要因为转换而放弃EnumSet的实用性).
需要一些有关如何创建自定义收集器以收集EnumSet的说明.
我需要一个EnumSet数组(通过varargs方法参数给出).首先,我很惊讶在EnumSet(有EnumSet#of(E first, E... rest))中没有varargs构造函数方法.作为一种解决方法,我使用了以下变体:
EnumSet<Options> temp = EnumSet.copyOf(Arrays.asList(options));
Run Code Online (Sandbox Code Playgroud)
但是,这会触发一个java.lang.IllegalArgumentException: Collection is empty.所以,现在我最终得到了以下内容,看起来有些荒谬:
EnumSet<Options> temp = options.length > 0 ?
EnumSet.copyOf(Arrays.asList(options)) :
EnumSet.noneOf(Options.class);
Run Code Online (Sandbox Code Playgroud)
如果当然这可以转移到一些实用方法,但仍然,我问自己是否有一种更简单的方法使用现有的方法?
EnumSet,就像enum它自身一样古老(自Java 5开始),应该是比特场的用例的非妥协替代品:像位域一样快速和精简(好吧,除了不是原始类型),以及类型安全的启动.另一方面,最新和多年来最受期待的Java API-Streams API - 毫不掩饰地使用了bitfields Spliterator的特性.
我是否应该认为上述内容是核心Java专家的明确承认,EnumSet毕竟不是那么好?我是否应该重新考虑从不使用位域的常见最佳实践建议?
如果我有一个枚举,我可以使用方便的EnumSet类创建一个EnumSet
enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }
EnumSet<Suit> reds = EnumSet.of(Suit.HEARTS, Suit.DIAMONDS);
EnumSet<Suit> blacks = EnumSet.of(Suit.CLUBS, Suit.SPADES);
Run Code Online (Sandbox Code Playgroud)
给两个EnumSets,我怎样才能创建一个包含这两个集的并集的新EnumSet?
EnumSet<Suit> redAndBlack = ?
我使用java枚举来定义如何使用按钮渲染模态窗口(Vaadin处理渲染).我的问题是,当我运行gui时,我的按钮每次都以随机顺序出现.所以我的问题是这个,因为我使用枚举设置来保持我的按钮,这将是无序的吗?什么是最好的方式使它成为有序列表?
我的设置枚举
public enum MODAL_SETTINGS {
NEW_MODAL_WINDOW("menu.context.new", "400", MODAL_BUTTON.SAVE, MODAL_BUTTON.CANCEL),
EDIT_MODAL_WINDOW("menu.context.modify","400", MODAL_BUTTON.UPDATE, MODAL_BUTTON.CANCEL),
DELETE_MODAL_WINDOW("menu.context.delete", "250", false, MODAL_BUTTON.DELETE, MODAL_BUTTON.CANCEL);
private EnumSet<MODAL_BUTTON> buttons;
private String caption;
private String width;
private boolean isResizable = true;
private MODAL_SETTINGS(String caption, String width, MODAL_BUTTON... buttons){
this.setCaption(caption);
this.setWidth(width);
this.buttons = EnumSet.copyOf(Arrays.asList(buttons));
}
private MODAL_SETTINGS(String caption, String width, boolean isResizable, MODAL_BUTTON... buttons){
this.setCaption(caption);
this.setWidth(width);
this.isResizable = isResizable;
this.buttons = EnumSet.copyOf(Arrays.asList(buttons));
}
public EnumSet<MODAL_BUTTON> getButtons(){
return buttons;
}
@Override
public String toString(){
String s = super.toString();
s=s.replaceAll("_", ".");
return …Run Code Online (Sandbox Code Playgroud) enumset ×10
java ×10
enums ×5
java-8 ×2
arrays ×1
bit-fields ×1
collections ×1
enum-map ×1
java-stream ×1
object ×1