Java枚举相关知识
JAVA枚举
很多编程语言都提供了枚举的概念,但是java直到1.5之后才提出了枚举的概念,出现比这个语言本身晚10年。
主要作用是用于定义有限个数对象的一种结构(多例设计),枚举就属于多例设计并且其结构要比多例设计要更加的简单。
1,枚举的基本定义
从JDK1.5之后在程序中提供了enum的关键字,利用此关键字可以实现枚举的定义。
范例:定义一个枚举
enum Color {
RED,GREEN,BLUE;
}
public class Main {
public static void main(String[] args) {
Color color=Color.RED;
System.out.println(color);
System.out.println("Hello World!");
}
}
在进行枚举处理的时候还可以利用values()方法获取所有的枚举对象进行输出。如果此时使用多例设计模式来进行设计,那么需要编写很多的程序代码,这样对于开发的复杂度是比较高的,因为里面牵扯到构造方法的私有化以及静态方法。多例设计与枚举设计可以实现相同的功能,但是枚举可以在程序编译的时候就判断所使用的实例化对象是否存在。
范例:获取所有的枚举对象
enum Color {
RED,GREEN,BLUE;
}
public class Main {
public static void main(String[] args) {
for (Color color:Color.values()){
System.out.println(color);
}
System.out.println("Hello World!");
}
}
从JDK1.5追加了枚举结构之后,就可以在switch之中进行枚举项的判断。如果此时通过多例设计来实现同样的功能,那么就需要使用对象数组了。
范例:观察枚举和switch处理
enum Color {
RED,GREEN,BLUE;
}
public class Main {
public static void main(String[] args) {
Color color=Color.GREEN;
switch (color){//直接支持枚举
case RED:System.out.println("红色");break;
case GREEN:System.out.println("绿色");break;
case BLUE:System.out.println("蓝色");break;
}
System.out.println("Hello World!");
}
}
多例上是无法实现这种与switch直接连接的,多例要想实现它就需要编写大量的if判断。
2,enum类
严格意义上讲枚举并不属于一种新的结构,它的本质相当于一个类,但是这个类会默认继承Enum类,首先观察一下Enum类的基本定义。
|
public abstract class Enum<E extends Enum<E>> extends Object implements Comparable<E>, Serializable |
现在定义的枚举类的类型就是Enum中所使用的E类型。下面我们观察Enum类中定义的方法:
|
No. |
方法名称 |
类型 |
|
|
01 |
protected Enum(String name, int ordinal) |
构造 |
传入名字和序号 |
|
02 |
public final String name() |
普通 |
获得对象的名字 |
|
03 |
public final int ordinal() |
普通 |
获得对象的序号 |
范例:检验上面方法
enum Color {
RED,GREEN,BLUE;
}
public class Main {
public static void main(String[] args) {
for (Color color:Color.values()){
System.out.println(color.ordinal()+"-"+color.name());
}
System.out.println("Hello World!");
}
}
面试题:请解释enum和Enum的区别?在枚举中每一个对象的序号都是根据枚举对象的定义顺序决定的。
l enum是从JDK1.5之后提供的一个关键字,用于定义枚举类;
l Enum是一个抽象类,所有使用enum关键字定义的类就默认继承此类;
3,定义枚举结构
一直在强调枚举本身就是一个多例设计模式,那么既然是多例设计模式,那么在一个类之中可以定义的结构很多,例如:构造方法、普通方法、属性等,那么这些内容也可以在枚举类中直接定义,但是需要注意的是:枚举类中定义的构造方法不能采用非私有化定义(public无法使用)
范例:在美居类中定义其他的结构
enum Color {
RED("红色"),GREEN("绿色"),BLUE("蓝色");
//枚举对象要写在第一行
//多例设计中每个对象都是一个static 的final常量,所以命名全部大写
private String title;
private Color(String title){
this.title=title;
}
@Override
public String toString(){
return this.title;
}
}
public class Main {
public static void main(String[] args) {
for (Color color:Color.values()){
System.out.println(color.ordinal()+"-"+color.name()+"-"+color);
}
System.out.println("Hello World!");
}
}
范例:让枚举实现接口本程序在简化程度上远远高于多例设计模式,除了这种基本的结构之外,在枚举类中也可以实现接口类的继承。
interface IMessage{
public String getMessage();
}
enum Color implements IMessage{
RED("红色"),GREEN("绿色"),BLUE("蓝色");//枚举对象要写在第一行,多例设计中每个对象都是一个static 的final常量
private String title;
private Color(String title){
this.title=title;
}
@Override
public String getMessage() {
return this.title;
}
}
public class Main {
public static void main(String[] args) {
IMessage msg=Color.GREEN;
System.out.println(msg.getMessage());
System.out.println("Hello World!");
}
}
范例:观察枚举中定义抽象方法枚举类中最有意思的是它可以直接定义抽象方法,并且要求每一个枚举对象都要独立覆写此抽象方法实现
enum Color {
RED("红色"){
public String getMessage(){
return this.toString();
}
},GREEN("绿色"){
public String getMessage(){
return this.toString();
}
},BLUE("蓝色"){
public String getMessage(){
return this.toString();
}
};//枚举对象要写在第一行,多例设计中每个对象都是一个static 的final常量
private String title;
private Color(String title){
this.title=title;
}
public String toString(){
return this.title;
}
public abstract String getMessage();
}
public class Main {
public static void main(String[] args) {
System.out.println(Color.GREEN.getMessage());
System.out.println("Hello World!");
}
}
枚举的定义是非常灵活的,但是在实际使用过程中,枚举更多情况下还是建议使用它的正确用法,就是定义一个实例对象即可。
4,枚举的实际使用
现在定义一个Person类,性别肯定不希望用户随便输入,所以使用枚举类最合适
范例:
enum Sex{
MALE("男"),FEMALE("女");
private String title;
private Sex(String title){
this.title=title;
}
public String toString(){
return this.title;
}
}
class Person{
private String name;
private int age;
private Sex sex;
public Person(String name, int age, Sex sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String toString(){
return "姓名:"+this.name+"、年龄:"+this.age+"、性别:"+this.sex;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(new Person("万雨",25,Sex.MALE));
System.out.println("Hello World!");
}
}
这个程序不使用枚举也可以正常实现,追加几个判断即可,所以对于枚举的使用全凭自愿。
Java枚举相关知识的更多相关文章
- 【转】java NIO 相关知识
原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...
- Java 容器相关知识全面总结
Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...
- 4)Java容器类相关知识
1>Array 和 Arrays: Arrays:用来操作array的工具类,其中包含一组static函数: equals():比较两个array 是否相等. array拥有相同元 ...
- Java GC相关知识
Java堆的分类 分为两类:YoungGen和OldGen.其中,YoungGen分为三部分:eden,from survivor和to survivor,比例默认是:8:1:1 PermGen不属于 ...
- Java继承相关知识总结
Java继承的理解 一.概念: 一个新类从已有的类那里获得其已有的属性和方法,这种现象叫类的继承 这个新类称为子类,或派生类,已有的那个类叫做父类,或基类 继承的好处:代码得到极大的重用.形成一种类的 ...
- Java异常相关知识总结
异常: 概述:java程序运行过程中出现的错误 常见的异常: StackOverflowError ArrayIndexOutOfBoundsException NullPointerExceptio ...
- Java——接口相关知识
1.接口用interface来声明 //定义一个动物接口 public interface Animal{ public void eat(); public void travel(); } 2.接 ...
- Java多线程相关知识
1)wait() notify() sleep() sleep是Thread类的函数,wait和notify是Object的函数. sleep的时候keep对象锁,wait的时候release 对 ...
- java相关知识集锦
java语言基础知识: Java8 Stream语法详解 不用循环 java 8系列之Stream的基本语法详解 java8 stream filter等功能代替for Java中try catch ...
随机推荐
- LeetCode 229. 求众数 II(Majority Element II )
题目描述 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1). 示例 1: 输入: [3,2,3] 输出: ...
- laravel-5.3(1) 路由配置
第一步: 按照上一篇搭建好工程后可以看到框架默认的 welcome 默认视图: 一般的web 开发框架是MVC设计模式,那么我们现在创建自己的控制器和视图,CMD 进入到工程根目录执行 php art ...
- 3.创建一个pod应用
创建一个应用:k8s增删查改: pod创建:kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 [roo ...
- ThreadLocal详解【使用场景】
转: 么是ThreadLocal 根据JDK文档中的解释:ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性. 从这里可以看出,引入Thre ...
- Mybatis中表名当做变量
做业务时,有时候会遇到不同SQL语句之中,只有使用的表名不用而已,其他参数和取得值都是一样的情况.这种时候必然想到把表名当做一个变量传到共通的SQL语句中. 当然正常的传入参数的方式#{param}肯 ...
- idea中maven右键没有show dependencies选项
如图,idea高版本(2018.3.4)中maven 的右键没有show dependencies菜单 查看依赖包方法,双击pom.xml文件,在文件编辑页面右键maven或者diagrams弹出依赖 ...
- LNK2019 无法解析的外部符号 该符号在函数 _main 中被引用
学习严蔚敏的数据结构,使用vc6新建项目,文件名分别如下: SequenceStack.cpp SequenceStack.h Status.h TestCase.c 报错如下: xilink6: e ...
- (转载)详解Javascript中prototype属性(推荐)
在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...
- 【ARM-Linux开发】Linux的SOCKET编程详解
Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...
- 【VS开发】VC++ 获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法
1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 str=tm ...