我有下面的例子:
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;
}在这段代码中,我可以理解Enum创建了一个大小为Size的Enum类型。
我的问题是:largeSize是EnumSet类型的对象吗?它的真正含义是什么?我真的很想更好地理解它。
发布于 2012-08-06 16:59:12
对于任何变量,其类型都可以在其声明中找到:
EnumSet largeSize所以,是的,largeSize (应该命名为largeSizes,因为它是一个集合)是EnumSet类型。它也应该被泛化,并因此被声明为
EnumSet<Size> largeSizes它的意思是,largeSizes是EnumSet类型。EnumSet是一个Set,它包含特定枚举类型的枚举实例,其方式比其他Set实现(如HashSet、TreeSet等)更有效。要了解EnumSet是什么,请阅读它的API。
发布于 2016-01-03 20:57:17
简单Enum是一组值,一次只能从中选择一个。使用您的示例,对于任何给定的布料,尺寸只能是S、M、L等之一。您可以使用简单的常量而不是Enum,但这具有可读性、更容易维护和严格的类型检查等优点。
当您需要一个变量同时使用多个Enum值时,将使用EnumSet。例如,您在屏幕上使用的字体可以同时使用粗体和斜体。EnumSet将允许您添加各种值,并测试在任何给定时间是否实际设置了其中一个值。如果您是从其他编程语言来到Java的,那么这就是通常称为标志的功能。
比较这两个:
enum Size { S, M, L, XL, XXL, XXXL }
Size currentSize;
...
currentSize = Size.S;
...
if (currentSize == Size.S) ...定义、分配并检查单个Enum值。
enum FontStyle { Bold, Italic, Underline, Strikethrough }
EnumSet<FontStyle> currentStyle;
...
currentStyle = EnumSet.of(FontStyle.Bold, FontStyle.Italic);
...
if (currentStyle.contains(FontStyle.Italic)) ...同时定义并分配两个Enum值,然后检查其中一个值是否已实际设置。
发布于 2012-08-06 17:22:13
简化您的代码
EnumSet<Size> largeSize = EnumSet.of(Size.XXXL, Size.XXL, Size.XL, Size.L);
for(Size size: largeSize)
System.out.print(size+" ");你可以看到largeSize是一个常规的集合,除了它是用来存储枚举的。这有什么不同呢?首先,JVM知道集合的所有可能值,这意味着它可以使用位图而不是存储所有对象,其中1表示项存在,0表示项不存在。这也意味着集合的顺序是序数值的顺序,即它们被定义的顺序。这就是为什么这个打印出来
L XL XXL XXXL如果您想了解更多细节,我建议您阅读本课程的源代码。
https://stackoverflow.com/questions/11825009
复制相似问题