public final class DataModel { /** Indicates the display style of clocks. */ public enum ClockStyle {ANALOG, DIGITAL} /** Indicates the preferred sort order of cities. */ public enum CitySort {NAME, UTC_OFFSET} /** Indicates the preferred behavior of hardware volume buttons when firing alarms. */ public enum AlarmVolumeButtonBehavior {NOTHING, SNOOZE, DISMISS} /** Indicates the reason alarms may not fire or may fire silently. */ public enum SilentSetting { @SuppressWarnings("unchecked") DO_NOT_DISTURB(R.string.alarms_blocked_by_dnd, 0, Predicate.FALSE, null), @SuppressWarnings("unchecked") MUTED_VOLUME(R.string.alarm_volume_muted, R.string.unmute_alarm_volume, Predicate.TRUE, new UnmuteAlarmVolumeListener()), SILENT_RINGTONE(R.string.silent_default_alarm_ringtone, R.string.change_setting_action, new ChangeSoundActionPredicate(), new ChangeSoundSettingsListener()), @SuppressWarnings("unchecked") BLOCKED_NOTIFICATIONS(R.string.app_notifications_blocked, R.string.change_setting_action, Predicate.TRUE, new ChangeAppNotificationSettingsListener()); private final @StringRes int mLabelResId; private final @StringRes int mActionResId; private final Predicate<Context> mActionEnabled; private final View.OnClickListener mActionListener; SilentSetting(int labelResId, int actionResId, Predicate<Context> actionEnabled, View.OnClickListener actionListener) { mLabelResId = labelResId; mActionResId = actionResId; mActionEnabled = actionEnabled; mActionListener = actionListener; } public @StringRes int getLabelResId() { return mLabelResId; } public @StringRes int getActionResId() { return mActionResId; } public View.OnClickListener getActionListener() { return mActionListener; } public boolean isActionEnabled(Context context) { return mLabelResId != 0 && mActionEnabled.apply(context); }}
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式
Class Enum<E extends Enum<E>>
,而E
表示枚举类型的名称。枚举类型的每一个值都将映射到protected Enum(String name, int ordinal)
构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
通常定义常量方法和枚举定义常量方法区别
以下内容可能有些无聊,但绝对值得一窥
1. 代码:
public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}
有什么不好了,大家都这样用了很长时间了,没什么问题啊。
首先,它不是类型安全的。你必须确保是int
其次,你还要确保它的范围是0 和1
最后,很多时候你打印出来的时候,你只看到 1 和0 ,
但其没有看到代码的人并不知道你的企图,抛弃你所有旧的public static final 常量吧
2. 可以创建一个enum 类,把它看做一个普通的类。除了它不能继承其他类了。(java 是单继承,它已经继承了Enum),
可以添加其他方法,覆盖它本身的方法
3. switch() 参数可以使用enum 了
4. values() 方法是编译器插入到enum 定义中的static 方法,所以,当你将enum 实例向上转型为父类Enum 是,values() 就不可访问了。解决办法:在Class 中有一个getEnumConstants() 方法,所以即便Enum 接口中没有values() 方法,我们仍然可以通过Class 对象取得所有的enum 实例
5. 无法从enum 继承子类,如果需要扩展enum 中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。
6. 使用EnumSet 代替标志。enum 要求其成员都是唯一的,但是enum 中不能删除添加元素。
7. EnumMap 的key 是enum ,value 是任何其他Object 对象。
8. enum 允许程序员为eunm 实例编写方法。所以可以为每个enum 实例赋予各自不同的行为。
9. 使用enum 的职责链(Chain of Responsibility) . 这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处理该请求。
10. 使用enum 的状态机
11. 使用enum 多路分发
更发现一篇枚举相关的好文:http://blog.csdn.net/sup_heaven/article/details/35559117
本以为RED只是一个Color类的一个static final的实例而已。但后然发现不是这样的,先看看下面的一种枚举类型使用的代码。
如果RED只是一个Color类的一个static final的实例,那么上面的代码就很让了费解了,为什么在枚举类型中可以有一个抽象方法,而每个枚举值可以对其重新实现?别急,看了我对这个类的测试代码你就明白,测试代码如下:
该运行结果首先说明了RED和Color不是同一个类,而是前者是后者的一个子类;同时也说明了enum申明的其实是一个abstract的类,所以Color中可以有抽象方法。那么,我们应该这么理解枚举类型的原理,首先enum Color继承了java.lang.Enum这个抽象类,但enum Color还是一个抽象类,所以它可以有抽象方法和非抽象方法。
而enum Color中的枚举值变量RED事实上上Color的一个匿名子类,所以它可以实现Color中的抽象方法,这样,当我们调用System.out.println(Color.RED.getName());
就是调用了匿名子类实现的方法。当然这些过程的很多事都有编译器等为我们做了,所以这里的代码很简单。
要是你不明白上面打印的内容,我再提供一个普通的类给你看看,还是类似的效果哦。
最后再附上网上一个使用Java普通类模拟枚举的例子http://blog.csdn.net/xyang81/article/details/7185428,这个例子真的很好。使用Java普通类模拟枚举
使用JDK5.0中提供的枚举特性
枚举功能测试
安卓系统源码--DeskClock源码解析(三)枚举
我选取了DataModel中的部分源码,是关于枚举的。
猜你喜欢
转载自blog.csdn.net/qiaojianfang_1148/article/details/79066017
今日推荐
周排行