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 ...
随机推荐
- CodeIgniter安装和入门使用(一)
CodeIgniter是个轻量级功能也强大的框架,适合做自己做小项目用,本文介绍CodeIgniter的安装和使用.安装 官网链接http://codeigniter.org.cn/user_guid ...
- Bootstrap4项目开发实战视频教程
一.企业网站项目 课件 0.课程简介 1.顶部区域的制作 2.导航区域的制作 3.轮播区域的制作 4.产品区域的制作 5.最新资讯区域的制作 6.底部区域的制作 二.化妆品网站项目 1.项目初始化_导 ...
- 前端知识点回顾之重点篇——JavaScript异步机制
JavaScript异步机制 来源:https://www.cnblogs.com/zhaodongyu/p/3922961.html JavaScript是单线程异步执行的,单线程意味着代码在任务队 ...
- CNN基础框架简介
卷积神经网络简介 卷积神经网络是多层感知机的变种,由生物学家休博尔和维瑟尔在早期关于猫视觉皮层的研究发展而来.视觉皮层的细胞存在一个复杂的构造,这些细胞对视觉输入空间的子区域非常敏感,我们称之为感受野 ...
- LINUX 的网站压力测试工具 webbench
网站压力测试工具-Webbench webbench简介: Webbench是有名的网站压力测试工具,它是由 Lionbridge公司(http://www.lionbridge.com ...
- 前台请求响应json
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- uni-app 手指左右滑动实现翻页效果
首先给页面添加 touch 事件 <view class="text-area" @touchstart="start" @touchend=" ...
- vue新增属性是否会响应式更新?
原文地址 在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. 根据官 ...
- 网站后台扫描工具dirbuster、御剑的用法
dirbuster DirBuster是Owasp(Open Web Application Security Project )开发的一款专门用于探测网站目录和文件(包括隐藏文件)的工具.由于使用J ...
- 【并行计算-CUDA开发】CUDA线程、线程块、线程束、流多处理器、流处理器、网格概念的深入理解
GPU的硬件结构,也不是具体的硬件结构,就是与CUDA相关的几个概念:thread,block,grid,warp,sp,sm. sp: 最基本的处理单元,streaming processor 最 ...