java枚举通俗实例解析
1 枚举
1.1 枚举的作用
我们经常要定义一些常量值,例如日期(MONDAY,TUESDAY……)或者错误码等。可以将常量组织起来,统一进行管理。常量比较只是值的比较,而枚举的比较需要传入枚举类型,代码更加规范,例如IsWeekend(MONDAY),不会出现IsWeekend(0)这样含义不明的代码。枚举实际上一个继承java.lang.Enum的类,由于java单继承的特性,枚举不再继承其他类,只能继承接口;枚举可以定义函数、属性。
常量实例:
public class DaysOfTheWeekConstants {
public static final int MONDAY = 0;
public static final int TUESDAY = 1;
public static final int WEDNESDAY = 2;
public static final int THURSDAY = 3;
public static final int FRIDAY = 4;
public static final int SATURDAY = 5;
public static final int SUNDAY = 6;
}
枚举示例:
public enum enDaysOfTheWeekConstants {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY ,
FRIDAY ,
SATURDAY ,
SUNDAY ;
}
1.2 枚举的基本方法
在enum中,提供了一些基本方法:
values():返回enum实例的数组,而且该数组中的元素严格保持在enum中声明时的顺序。
(1)name():返回实例名。
(2)ordinal():返回实例声明时的次序,从0开始。
(3)getDeclaringClass():返回实例所属的enum类型。
(4)equals() :判断是否为同一个对象。
可以使用 == 来比较enum实例。地址比较;
此外,java.lang.Enum实现了Comparable和 Serializable 接口,所以也提供 compareTo() 方法。compareTo()是进行值比较,相等返回0,大于,返回1,小于返回-1.
例:展示enum的基本方法
public class EnumMethodDemo {
enum Color {RED, GREEN, BLUE;}
enum Size {BIG, MIDDLE, SMALL;}
public static void main(String args[]) {
System.out.println("=========== Print all Color ===========");
for (Color c : Color.values()) {
System.out.println(c + " ordinal: " + c.ordinal());
}
/*输出顺序值。从0开始;
=========== Print all Color ===========
RED ordinal: 0
GREEN ordinal: 1
BLUE ordinal: 2
*/
Color green = Color.GREEN;//
System.out.println("green name(): " + green.name());//输出:green name(): GREEN
System.out.println("green getDeclaringClass(): " + green.getDeclaringClass());//输出: green getDeclaringClass(): class org.zp.javase.enumeration.EnumDemo$Color
System.out.println("green hashCode(): " + green.hashCode());//输出:green hashCode(): 460141958
System.out.println("green compareTo Color.GREEN: " + green.compareTo(Color.GREEN));// green compareTo Color.GREEN: 0
System.out.println("green equals Color.GREEN: " + green.equals(Color.GREEN));// green equals Color.GREEN: true
System.out.println("green equals Size.MIDDLE: " + green.equals(Size.MIDDLE));// 地址比较:green equals Size.MIDDLE: false
System.out.println("green equals 1: " + green.equals(1)); green equals 1: false
}
}
==号和Equal是地址比较,CompareTo是值比较
1.3 枚举类介绍
简单的枚举类创建
public enum DaysOfTheWeek {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
enum是一种受限制的类,这个类继承自 java.lang.Enum。枚举类可以有自己的构造函数、方法、属性。
public enum DaysOfTheWeekFields {
MONDAY(false),
TUESDAY(false),
WEDNESDAY(false),
THURSDAY(false),
FRIDAY(false),
SATURDAY(true),
SUNDAY(true);//枚举的申明,最后一定要用分号;
private final boolean isWeekend;//enum的属性
private DaysOfTheWeekFields( final boolean isWeekend ) {//构造函数
this.isWeekend = isWeekend;
}
//方法
public boolean isWeekend() {
return isWeekend;
}
}
使用枚举代码实例
DaysOfTheWeekFields enumday = DaysOfTheWeekFields. MONDAY(false);
If(enumday.equals(DaysOfTheWeekFields. MONDAY))
1.4 枚举与接口
实现接口public interface weekend{boolean isWeekend();}
枚举类的定义如下
public enum DaysOfTheWeekFields implements weekend {
MONDAY(false),
TUESDAY(false),
WEDNESDAY(false),
THURSDAY(false),
FRIDAY(false),
SATURDAY(true),
SUNDAY(true);//枚举的申明,最后一定要用分号;
private final boolean isWeekend;//属性
private DaysOfTheWeekFields( final boolean isWeekend ) {//构造函数
this.isWeekend = isWeekend;
}
//实现接口的方法
public boolean isWeekend() {
return isWeekend;
}
}
1.5 组织枚举
当我们需要建立一个枚举来表示所有的食物,但是食物又细分小类:水果、主食、蔬菜;我们不希望将这些所有的食物混乱的放在一个枚举中,而希望水果、主食、蔬菜都各自分类。然后再将这些小的分类组织在一起,通过同一个接口对外提供使用。这就是组织枚举。组织枚举是通过一个接口interface将各个子类组织起来,具体实例如下:
Public interface Food{//定义一个接口
//创建水果枚举
enum Fruit implements Food{
APPLE,ORENGE,BANANA;}
}
//创建主食枚举
Enum MainFood implements Food{
RICE,NOODEL;
}
//创建蔬菜枚举
Enum Vegetables implements Food{
TAMATA,CUCUMBER;
}
//使用实例
public class InterfaceOrganizeEnum {
public static void main(String[] args) {
Food food = Fruit. APPLE;
food = MainFood. RICE;
}
}
上面的实例先创建了一个接口,然后在接口中定义了三个小类枚举,都属于Food这个大类。这样就可以定义接口引用food,来指向任何小类的枚举值。
1.6 策略枚举
顾名思义,就是对不同的枚举采用不同的处理策略;原有常用的方法是通过switch语句判断不同的枚举类型,进行不同的处理操作。例如加减乘除基本运算,先要用switch语句来判断运算符,然后在进行计算值。策略枚举这是将加减乘除定义为四个枚举类型,枚举定义抽象方法calculate,各个枚举值实现不同的运算方法。
// 策略枚举
enum Calculator {
// 加法策略的实现
Add(){
public int calculate(int a, int b) {
return (a + b);
}
}, // 这里用逗号隔开各个枚举变量
// 减法策略的实现
Sub(){
public int calculate(int a, int b) {
return (a - b);
}
}; // 这里用分号结束枚举变量的定义
// 定义抽象算法方法,让每个枚举变量来具体实现
public abstract int calculate(int a, int b);
}
//策略枚举使用实例
public class Client {
public static void main(String[] args) {
// 加法
System.out.println(Calculator.Add.calculate(20, 13));
// 减法
System.out.println(Calculator.Sub.calculate(20, 13));
}
}
1.7 EnumSet,EnumMap 的应用
EnumSet,EnumMap是两个用来保存枚举的集合。通过枚举类来获得枚举值。
public class Test {
public static void main(String[] args) {
// EnumSet的使用
EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
for (EnumTest day : weekSet) {
System.out.println(day);
}
// EnumMap的使用
EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
//插入枚举值
weekMap.put(EnumTest.MON, "星期一");
weekMap.put(EnumTest.TUE, "星期二");
// ... ...
for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
Entry<EnumTest, String> entry = iter.next();
System.out.println(entry.getKey().name() + ":" + entry.getValue());
}
}
}
java枚举通俗实例解析的更多相关文章
- java代理通俗简单解析
1 代理 1.1 代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象, ...
- Java反射机制实例解析
1.获取想操作的访问类的java.lang.Class类的对象 2.调用Class对象的方法返回访问类的方法和属性信息 3.使用反射API来操作 每个类被加载后,系统会为该类 ...
- Java 正则表达式详细实例解析
案例1:判断字符串是否是abc package Regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * ...
- java枚举类型的优势在哪里?--一个实例
最近在做一个项目,其中涉及到一组操作,命名为: 1. "add"; 2. "logicDel" 3. "physicDel" 4. &quo ...
- java枚举在android项目应用
今天修复一个公司非常早曾经的android应用功能,里面的代码逻辑已经全然错乱,然后发现返回的数据全然不正确了.然后修复了整整两天.然后我又一次整理了一遍,重构就算不上了. 然后就用上了枚举. 什么是 ...
- Java高级面试题解析(二):百度Java面试题前200页(精选)
基本概念 操作系统中 heap 和 stack 的区别 heap是堆,stack是栈,是两种不同的数据结构.堆是队列优先,先进先出:栈是先进后出. 在java多线程中,每个线程都有自己的栈:不同的线程 ...
- Java枚举的用法和原理深入
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10843644.html 一:枚举的用法 1.定义和组织常量 在JDK1.5之前,我们定义常量都是:publi ...
- Java枚举解读
Java枚举 枚举类概念的理解与定义 一个类的对象是有限个,确定的,我们称此为枚举类. 当需要定义和维护一组常量时,强烈建议使用枚举类. 如果一个枚举类中只有一个对象,则可以作为单例模式的实现方式. ...
- Java 枚举用法详解
概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GR ...
随机推荐
- zookeeper的使用demo(c#/java)
Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它 ...
- XML CDATA识别“<,>”
http://www.w3school.com.cn/xml/xml_cdata.asp 术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Dat ...
- leafLet入门教程兼leafLet API中文文档参考
英文文档参考:https://leafletjs.com/reference-1.3.4.html#popup 博客参考:https://blog.csdn.net/qq_36595013/artic ...
- PHP yii框架FormWidget组件
本篇文章介绍的是PHP yii框架Form组件,方便在view层更好调用此功能,话不多说上代码:1.先继承yii本身Widget类 <?php/** * User: lsh */ namespa ...
- CASE WHEN 及 SELECT CASE WHEN的用法
CASE WHEN 及 SELECT CASE WHEN的用法 Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WHEN '1' THEN '男' WH ...
- parcel 在js中导入 html 文件
parcel不支持将html文件导入为字符串,如果您对parcel使用熟练,直接使用 parcel-plugin-phtml 插件即可,此插件使用 .phtml 后缀 为什么用parcel? 因为从我 ...
- VDSR
提出SRCNN问题 context未充分利用 Convergence 慢 Scale Factor 训练指定fator的模型再重新训练其他fator的模型低效 context 对于更大的scale-f ...
- svn与cvs的一些比较
所有的文档都显示SVN可以取代CVS,同时SVN的问题和缺点都被隐藏了.不幸的是,我们并不认为SVN是CVS的替代品,尽管很多缺陷都被修改了.更有甚者,它甚至让人重回VSS.CVS和SVN的比较类似与 ...
- ABP入门系列之3——创建实体/Code First创建数据表
一.首先来看看ABP体系结构 领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现.实体(Entity): 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表.仓储(Repo ...
- python 包 笔记
绝对导入和相对导入 我们的最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式: 绝对导入:以glance作为起始 相对导入: ...