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枚举通俗实例解析的更多相关文章

  1. java代理通俗简单解析

    1         代理 1.1            代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象, ...

  2. Java反射机制实例解析

    1.获取想操作的访问类的java.lang.Class类的对象     2.调用Class对象的方法返回访问类的方法和属性信息     3.使用反射API来操作      每个类被加载后,系统会为该类 ...

  3. Java 正则表达式详细实例解析

    案例1:判断字符串是否是abc package Regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * ...

  4. java枚举类型的优势在哪里?--一个实例

    最近在做一个项目,其中涉及到一组操作,命名为: 1. "add"; 2. "logicDel" 3. "physicDel" 4. &quo ...

  5. java枚举在android项目应用

    今天修复一个公司非常早曾经的android应用功能,里面的代码逻辑已经全然错乱,然后发现返回的数据全然不正确了.然后修复了整整两天.然后我又一次整理了一遍,重构就算不上了. 然后就用上了枚举. 什么是 ...

  6. Java高级面试题解析(二):百度Java面试题前200页(精选)

    基本概念 操作系统中 heap 和 stack 的区别 heap是堆,stack是栈,是两种不同的数据结构.堆是队列优先,先进先出:栈是先进后出. 在java多线程中,每个线程都有自己的栈:不同的线程 ...

  7. Java枚举的用法和原理深入

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10843644.html 一:枚举的用法 1.定义和组织常量 在JDK1.5之前,我们定义常量都是:publi ...

  8. Java枚举解读

    Java枚举 枚举类概念的理解与定义 一个类的对象是有限个,确定的,我们称此为枚举类. 当需要定义和维护一组常量时,强烈建议使用枚举类. 如果一个枚举类中只有一个对象,则可以作为单例模式的实现方式. ...

  9. Java 枚举用法详解

    概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GR ...

随机推荐

  1. springmvc中的一些服务器报错

    这是springmvc的前端控制器的加载格式要求.服务器加载web.xml后,它会在web-inf/下找名为spring[servlet名/handler处理器名]-servlet.xml文件. 可以 ...

  2. windows10上安装mysql(详细步骤)

    2016年09月06日 08:09:34 阅读数:46198 环境:windwos 10(1511) 64bit.mysql 5.7.14 时间:2016年9月5日 一.下载mysql 1. 在浏览器 ...

  3. runTime动态给类添加属性

    #项目中需要给系统类添加属性 #需要注意的地方就是.m中   set 和 get  ,get方法中方法名和添加的属性名一致,set中可以用驼峰 #import <UIKit/UIKit.h> ...

  4. git宝典—应付日常工作使用足够的指北手册

    最近公司gitlab又迁移,一堆git的命令骚操作,然鹅git命令,感觉还是得复习下——其实,git现在界面操作工具蛮多,比如intellij 自带的git操作插件就不错,gitlab github ...

  5. centos7 安装 redis-4.0.9

    下载地址:https://redis.io/download 下载 安装: $ wget http://download.redis.io/releases/redis-4.0.9.tar.gz $ ...

  6. 关于Xamarin、Qml、数据绑定、MVC、MVVM 相关的散讲

    关于Xamarin.Qml.数据绑定.MVC.MVVM 相关的散讲 SURFSKY 2017.02 最近又在学习Xamarin了?为什么是“又”?有几个利好消息,让我重新拾起它: ()微软去年收购了X ...

  7. Android-Gradle(四)

    当你在开发一个app,通常你会有几个版本.大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要一个生产版本.这些版本通常有不同的设置,例如不同的URL地址.更可能的是你可能需要一个 ...

  8. 【转载】Sikuli安装及使用——基于图像识别自动化工具

    一.Sikuli能做什么? 用屏幕截图的方式,用截出来的图形元素组合出神奇的程序实现自动化安装.卸载软件,自动化测试(Windows.mac应用测试,Web测试,移动端测试) 二.安装Sikuli 预 ...

  9. Hi3516A开发--接触(转)

    Hi3516A开发--接触

  10. Springboot 配置类( @Configuration) 不能使用@Value注解从application.propertyes中加载值以及Environment为null解决方案

    最近遇到个场景,需要在使用@Bean注解定义bean的时候为对象设置一些属性,比如扫描路径,因为路径经常发布新特性的时候需要修改,所以就计划着放在配置文件中,然后通过@ConfigurationPro ...