Java基础笔记 – 枚举类型的使用介绍和静态导入
本文由发表于6年前 | Java基础 | 暂无评论 |  被围观 14,299 views+
1、枚举(Enum):1.1、枚举类型中的两个静态方法:1.2、values方法的使用:1.2、values方法的使用:1.3、创建包含私有成员变量的枚举常量:1.4、枚举类型详细说明:1.5、枚举的比较:1.6、枚举的相关方法:2、EnumSet:2.1、of方法2.2、noneOf方法3、List保存枚举类型:4、EnumMap类:5、枚举在实际开发中的使用:6、静态导入:
1、枚举(Enum):

JDK5.0中加入了枚举类型,使用enum关键字定义,可以按照如下定义:

public enum Weather{
    Sunny,
    Rainy,
    Cloudy,
}
1.1、枚举类型中的两个静态方法:
values()
        获取枚举类型的所有枚举常量
valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
1.2、values方法的使用:
for(Weather weather : Weather.values()){
    System.out.println(weather);
}
System.out.println(Weather.valueOf(Weather.class, "Sunny"));
1.2、values方法的使用:
for(Weather weather : Weather.values()){
    System.out.println(weather);
}
//以下输出为Sunny
System.out.println(Weather.valueOf(Weather.class, "Sunny"));
1.3、创建包含私有成员变量的枚举常量:
public enum Weather{
    Sunny("晴天"),
    Rainy("雨天"),
    Cloudy("多云");
    //私有成员变量,保存名称
    private String value;

    public String getValue() {
        return value;
    }
    //带参构造函数
    Weather(String value){
        this.value = value;
    }
}
public static void main(String[] args) {
    Weather weather1 = Weather.Sunny;
    //以下输出为"晴天"
    System.out.println(weather1.getValue());
}
1.4、枚举类型详细说明:

enum关键字的作用类似于class或interface,本质上是在定义一个类别,细节的实现由编译器完成。

自定义的枚举类型实质上继承自java.lang.Enum抽象类。而每一个成员常量其实就是自己定义的枚举类型的一个实例,都被定义为final,所有无法改变他们,另外他们是static,pulibc的,即:

public static final 枚举常量;

在运行期间我们无法再使用该枚举类型创建新的实例,这些实例是在编译期间就完全确定下来了的。

1.5、枚举的比较:
compareTo
public final int compareTo(E o)
比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。 枚举常量只能与相同枚举类型的其他枚举常量进行比较。该方法实现的自然顺序就是声明常量的顺序。
指定者:
接口 Comparable<E extends Enum<E>> 中的 compareTo
参数:
o - 要比较的对象。
返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
Weather[] arrays = Weather.values();
for(Weather weather2 : arrays){
    System.out.println((Weather.Sunny).compareTo(weather2));
}
1.6、枚举的相关方法:
ordinal
public final int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 大多数程序员不会使用此方法。它被设计用于复杂的基于枚举的数据结构,比如 EnumSet 和 EnumMap。
返回:
枚举常量的序数
for(Weather weather2 : arrays){
    System.out.println(weather2.ordinal() + ":" + weather2);
}
2、EnumSet:
public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
implements Cloneable, Serializable

与枚举类型一起使用的专用 Set 实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。枚举 set 在内部表示为位向量。此表示形式非常紧凑且高效。此类的空间和时间性能应该很好,足以用作传统上基于 int 的“位标志”的替换形式,具有高品质、类型安全的优势。如果其参数也是一个枚举 set,则批量操作(如 containsAll 和 retainAll)也应运行得非常快。

此类可以帮助我们建立枚举值的集合,里面提供了一系列的静态方法,可以指定不同的集合建立方式。

2.1、of方法
public static <E extends Enum<E>> EnumSet<E> of(E first,
                                                E... rest)
创建一个最初包含指定元素的枚举 set。此工厂方法的参数列表使用变量参数功能,该方法可以创建一个最初包含任意个元素的枚举 set,但是这样很可能比不使用变量参数的重载运行得慢。
参数:
first - 此 set 最初要包含的元素
rest - 此 set 最初要包含的其余元素
返回:
最初包含指定元素的枚举 set
抛出:
NullPointerException - 如果任意参数为 null,或 rest 为 null
EnumSet<Weather> enumSet = EnumSet.of(Weather.Sunny, Weather.Rainy);

for(Iterator<Weather> iter = enumSet.iterator(); iter.hasNext();){
    System.out.println(iter.next());
}
2.2、noneOf方法
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType)
创建一个具有指定元素类型的空枚举 set。
参数:
elementType - 此枚举 set 的元素类型的 class 对象
抛出:
NullPointerException - 如果 elementType 为 null
EnumSet<Weather> enumSet2 = EnumSet.noneOf(Weather.class);
enumSet2.add(Weather.Sunny);
enumSet2.add(Weather.Rainy);

for(Iterator<Weather> iter = enumSet2.iterator(); iter.hasNext();){
    System.out.println(iter.next());
}
3、List保存枚举类型:
List<Weather> list = new ArrayList<Weather>();
list.add(Weather.Sunny);
list.add(Weather.Cloudy);

for(Iterator<Weather> iter = list.iterator(); iter.hasNext();){
    System.out.println(iter.next());
}
4、EnumMap类:
public class EnumMap<K extends Enum<K>,V>
        extends AbstractMap<K,V>
        implements Serializable, Cloneable

与枚举类型键一起使用的专用 Map 实现。枚举映射中所有键都必须来自单个枚举类型,该枚举类型在创建映射时显式或隐式地指定。枚举映射在内部表示为数组。此表示形式非常紧凑且高效。

枚举映射根据其键的自然顺序 来维护(该顺序是声明枚举常量的顺序)。在 collection 视图(keySet()、entrySet() 和 values())所返回的迭代器中反映了这一点。

EnumMap
public EnumMap(Class<K> keyType)
创建一个具有指定键类型的空枚举映射。
参数:
keyType - 此枚举映射的键类型的 class 对象
抛出:
NullPointerException - 如果 keyType 为空
Map<Weather, String> enumMap = new EnumMap<Weather, String>(Weather.class);
enumMap.put(Weather.Sunny, "晴天");
enumMap.put(Weather.Rainy, "雨天");
5、枚举在实际开发中的使用:
public static String getString(Weather weather){
    if(weather == Weather.Sunny){
        return Weather.Sunny.getValue();
    } else if(weather == Weather.Rainy){
        return Weather.Rainy.getValue();
    } else if(weather == Weather.Cloudy){
        return Weather.Cloudy.getValue();
    }
    return "不符合的天气情况";
}

调用上面的方法:

Weather weather3 = Weather.Sunny;
System.out.println(getString(weather3));
6、静态导入:

如果要使用静态变量或者方法,必须给出该方法所在的类。而使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,这样就无需给出他们的类名了:

如加入以下导入语句:

import static java.util.EnumSet.noneOf;

就可以直接使用这个静态方法了:

EnumSet<Weather> enumSet2 = noneOf(Weather.class);
enumSet2.add(Weather.Sunny);
enumSet2.add(Weather.Rainy);
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-import.html
关键字: , , ,
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2011 10/31
文章评论
    没有评论
给我留言

有人回复时邮件通知我
Java基础的相关文章
随机文章 本月热门 热评
1 ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池 2012/7/30
2 Android中使用Gson解析JSON数据 2011/7/14
3 JBoss服务器的安装 基本配置和使用 2011/11/29
4 密码保护:侃侃可乐面包 2012/10/5
5 基于分享式的试题库系统 | Project 2011/11/14
6 C语言语法笔记 – 基本语法介绍 预处理命令 2011/8/30
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.