菜鸡的Java笔记 - java 枚举
枚举
枚举属于加强版的多例设计模式
多例设计模式与枚举
多例设计模式的本质在于构造方法的私有化。而后在类的内部产生若干个实例化对象,随后利用一个 static 静态方法进行指定实例化对象的获得
范例:多例
package cn.mysterious; public class Enumeration {
public static void main(String[] args) {
Color redInstance = Color.getInstance(0);
System.out.println(redInstance);
}
}
class Color{
private static final Color RED = new Color("red");
private static final Color GREEN = new Color("green");
private static final Color BLUE = new Color("blue");
private String title;
private Color(String title){
this.title = title;
}
private void getInstance(int ch) {
// TODO Auto-generated method stub
switch (ch) {
case 0 : return RED;
case 1 : return GREEN;
case 2 : return BLUE;
default : return null;
}
}
public String toString() {
// TODO Auto-generated method stub
return this.title;
}
}
这个时候有人开始考虑了,多例实现的太麻烦了。多例设计是在JDK1.5之前出现的主要设计模式,其主要的目的是为了解决java缺少枚举带来的影响
如果在JDK1.5之后,多例的设计可以变为如下形式:
package cn.mysterious; public class Enumeration {
public static void main(String[] args) {
Color redInstance = Color.RED;
System.out.println(redInstance);
}
}
enum Color{
RED,GREEN,BLUE;
}
用枚举搞一个结构其最终的效果和多例是一样的,所以枚举的主要功能是替代多例设计
Enum 与 enum
在JDK1.5之后追加有enum 关键字,那么这个关键字的主要目的是进行枚举定义
但是使用enum严格来讲并不算是一种所谓的新结构它只不过是相当于定义一个类,并且这个类默认继承了Enum父类
Enum类的定义观察:
public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>, Serializable
Enum类里面允许使用的属性的类型必须是Enum 类或其子类的类型
但是这一操作基本上我们不需要去关注,对应的类型(RED,GREEN,BLUE,都是Color 的对象,而Color是一个枚举,枚举继承Enum)
而在Enum类中提供有一个构造方法:protected Enum(String name,int ordinal)
protected 是一个封装性,证明此时的Enum 构造方法值允许本包的类或不同的子类调用,在这个构造方法里面设置有 name (名字) 和 ordinal (编号)
这个构造也不是由你调用的,是由Enum 调用的
而在Enum类里面也提供有两个对应的方法:
获得对象的名字: public final String name()
获得对象的序号: public final int ordinal()
范例:在枚举类对象中使用以上两个方法:
package cn.mysterious; public class Enumeration {
public static void main(String[] args) {
Color redInstance = Color.RED;
System.out.println(redInstance.name());
System.out.println(redInstance.ordinal());
}
}
enum Color{
RED,GREEN,BLUE;
}
/* 结果是
RED
0
*/
默认的名字就是对象名字,序号就是对象定义的顺序
而将多例定义为枚举之后还可以取得全部对象信息,因为所有的枚举类中包含有一个 values() 方法,
这个方法可以以对象数据的形式返回全部枚举对象
范例:枚举取得全部对象
package cn.mysterious; public class Enumeration {
public static void main(String[] args) {
for (Color c: Color.values()) {
System.out.println(c.ordinal()+ "=" + c.name());
}
}
}
enum Color{
RED,GREEN,BLUE;
}
面试题:请解释 enum 与 Enum 的区别?
enum是一个JDK1.5后追加的关键字,使用enum 可以定义枚举类,相当于定义一个类继承子Enum父类
在枚举中定义类结构
枚举hi在类的基础上发展起来的,所以枚举本身也可以进行构造方法,属性,普通方法的定义
但是需要注意的是:多例设计之中重点的要求“构造方法私有化(私有化不是简单的指 private ,还包括 default,protected )”
范例:定义枚举类型
package cn.mysterious; public class Enumeration {
public static void main(String[] args) {
for (Color c: Color.values()) {
System.out.println(Color.BLUE);// 直接调用 toString()
}
}
}
enum Color{
GREEN("绿色"),RED("红色"),BLUE("蓝色"); // 对象要写在第一行
private String title;
private Color(String title){
this.title = title;
}
public String toString(){
return this.title;
}
}
除了可以进行基本的结构定义之外,枚举里面还可以实现接口
范例:枚举实现接口
package cn.mysterious; public class Enumeration {
public static void main(String[] args) {
IMessage msg = Color.BLUE; // 对象向上转型
System.out.println(msg.getColor());
}
}
interface IMessage{
public String getColor();
}
enum Color implements IMessage{ // 实现父接口
GREEN("绿色"),RED("红色"),BLUE("蓝色"); // 对象要写在第一行
private String title;
private Color(String title){
this.title = title;
}
public String toString(){
return this.title;
}
@Override
public String getColor() {
// TODO Auto-generated method stub
return this.title;
}
}
普通类是无法定义抽象的,但是枚举类里面可以定义抽象方法于是这个时候枚举的每一个实例化对象都必须去覆写此抽象方法
范例:枚举定义抽象方法
package cn.mysterious; public class Enumeration {
public static void main(String[] args) {
System.out.println(Color.BLUE.getColor());
}
} enum Color { // 实现父接口
GREEN("绿色"){
public String getColor() {
// TODO Auto-generated method stub
return "绿色";
}
},RED("红色"){
public String getColor() {
// TODO Auto-generated method stub
return "红色";
}
},BLUE("蓝色"){
public String getColor() {
// TODO Auto-generated method stub
return "蓝色";
}
}; // 对象要写在第一行
private String title;
private Color(String title){
this.title = title;
}
public String toString(){
return this.title;
}
public abstract String getColor();
}
对以上的程序结构有些了解就可以了,java之中的枚举设计非常复杂,实际之中不需要那么复杂
枚举应用
下面通过一个简单的程序来观察枚举的使用
范例:定义一个描述用户的类。里面有用户的性别
package cn.mysterious; public class Enumeration {
public static void main(String[] args) {
Member mem = new Member("少公子",20,Sex.MALE);// 创建新用户
System.out.println(mem);
}
}
class Member{
private String name;
private int age;
private Sex sex;
public Member(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;
}
}
enum Sex{
MALE("男"),FEMALE("女");
private String title;
private Sex(String title){
this.title = title;
}
public String toString(){
return this.title;
}
}
对于以上的操作,如果不使用枚举没有任何问题,所以对于枚举我们需要公正的认识它:如果你习惯于使用枚举开发,那么就继续用,如果没习惯,能看懂可以不用
菜鸡的Java笔记 - java 枚举的更多相关文章
- Java 笔记 —— java 和 javac
Java 笔记 -- java 和 javac h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: ...
- 菜鸡的Java笔记 - java 断言
断言:assert (了解) 所谓的断言指的是在程序编写的过程之中,确定代码执行到某行之后数据一定是某个期待的内容 范例:观察断言 public class Abnorma ...
- 菜鸡的Java笔记 - java 正则表达式
正则表达式 RegularExpression 了解正则表达式的好处 正则表达式的基础语法 正则表达式的具体操作 content (内容 ...
- 菜鸡的Java笔记 - java 线程常用操作方法
线程常用操作方法 线程的命名操作,线程的休眠,线程的优先级 线程的所有操作方法几乎都在 Thread 类中定义好了 线程的命名和取得 ...
- 菜鸡的Java笔记 - java 访问控制权限
java中四种访问控制权限的使用 内容 在java里面一共定义有四个权限,按照由小到大的顺序:private<defaule<prote ...
- 菜鸡的Java笔记 - java 常用类库
CommonClassLibrary 常用类库 定时调度 定时调度指的是每到一个时刻,都会自动的产生某些特定的操作形式 con ...
- 菜鸡的Java笔记 - java 反射机制
反射机制 1.观察 Class 类的使用 2.利用反射改善工程设计模式 3.反射操作类结构 content (内容) 1. ...
- 菜鸡的Java笔记 java基础类库 BaseClassLibrary
java基础类库 BaseClassLibrary StringBuffer 类的特点 StringBuffer,StringBuilder,String 类之间的关系 ...
- 菜鸡的Java笔记 java数据库编程(JDBC)
java数据库编程(JDBC) 介绍 JDBC 的基本功能 content (内容) 现在几乎所有的项目开发过程之中都不可能离开数据库,所以在java ...
随机推荐
- JSP页面属性
一.JSP指令 <%@指令名属性名=属性值 %> page指令: 定义页面是如何解析 include指令: 静态包含 taglib指令: 在页面引入标签呢库. 1.page指令属性 imp ...
- 做毕设的tricks
CNKI上无法下载博硕士学位论文的PDF版本,只有CAJ版本,挺恶心的.直接下载安装Chrome extension就可以解决了. 链接:https://share.weiyun.com/5HGFF2 ...
- salesforce零基础学习(一百零八)MFA
本篇参考:https://security.salesforce.com/mfa https://sfdc.co/bvtuQT (MFA官方研讨会的文档) https://sfdc.co/iwiQK ...
- Asp.Net Core 中的HTTP协议详解
1.前言 好久没写博客了,最近虽然没什么假期,但是却比以前还忙!工作.工作.工作,就像赶集似的,聚在一起.对于Web开发人员来说,深入了解HTTP有助于我们开发出更好.更高的Web应用程序.当应用程序 ...
- docker-compose 搭建kafka集群
docker-compose搭建kafka集群 下载镜像 1.wurstmeister/zookeeper 2.wurstmeister/kafka 3.sheepkiller/kafka-manag ...
- 独家对话阿里云函数计算负责人不瞋:你所不知道的 Serverless
作者 | 杨丽 出品 | 雷锋网产业组 "Serverless 其实离我们并没有那么遥远". 如果你是一名互联网研发人员,那么极有可能了解并应用过 Serverless 这套技术体 ...
- 第21篇-加载与存储指令之iload、_fast_iload等(3)
iload会将int类型的本地变量推送至栈顶.模板定义如下: def(Bytecodes::_iload , ubcp|____|clvm|____, vtos, itos, iload , _ ); ...
- 使用mobaXtrem显示CentOS图形
安装环境 yum install -y xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 \mesa-l ...
- Fastjson中getJSONObject()与getJSONArray()的使用
测试JSON串: { "package": { "List1": { "errorCode": "0", "e ...
- PAT (Basic Level) Practice (中文)1025 反转链表 (25分)
1025 反转链表 (25分) 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→ ...