Java——枚举基础应用总结(多例设计模式、Enum类、枚举的实际应用)
1、多例设计模式与枚举
多例设计模式一定是构造方法私有化,而后在内部类种产生若干个实例化对象。
【举例】:定义颜色基色的多例模式
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Color c = Color.getInstance(1);
System.out.println(c.toString());
}
}
class Color{
private static final Color RED = new Color("红色");
private static final Color GREEN = new Color("绿色");
private static final Color BLUE = new Color("蓝色");
private String title;
public Color(String title) {
this.title = title;
}
@Override
public String toString() {
return "Color{" +
"title='" + title + ''' +
'}';
}
public static Color getInstance(int ch){
switch (ch){
case 0:
return RED;
case 1:
return GREEN;
case 2:
return BLUE;
default:
return null;
}
}
}
以上代码,JDK1.5前编写OK,但是很麻烦,getInstance方法没什么意义,且内部中实例化对象的个数未知。因此,JDK1.5开始提供了enum关键字,其可以实现与多例相同的功能,如下所示:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Color c = Color.RED;
System.out.println(c);
}
}
enum Color{
RED,GREEN,BLUE;
}
多例是枚举的设计思想来源,所以枚举中定义对象都要用大写字母表示,此外,枚举的最大的支持在于可以实现所有枚举对象的遍历操作。
for(Color c:Color.values()){
System.out.println(c);
}
2、java.lang.Enum类
使用enum定义的枚举类不属于一个新的结构,本质上相当于一个类继承了java.lang.Enum类的形式,观察下Enum类的定义形式:
public abstract class Enum<E extends Enum<E>> extends Object implements Comparable<E>, Serializable |
---|
Enum类中定义的构造方法:
protected Enum(String name, int ordinal) |
---|
protected 权限表示只能在本包或不同包的子类才可以调用,其实就是构造方法的封装。该构造方法中第一个参数表示对象名字,第二个表示对象序号。
Enum类中有两个方法,可以取得名字和序号:
- public final String name()
- public final int ordinal()
for(Color c:Color.values()){
System.out.println(c.name()+c.ordinal());
}
枚举中的序号是根据对象的定义顺序来的。
【面试题】:请解释Enum与enum的区别?
- enum是JDK1.5后新增的关键字,用来定义枚举;
- Enum是一个抽象类,使用enum定义的枚举本质就相当于一个继承了Enum类。
3、枚举结构定义
枚举在Java中就属于一种特殊的类,但是类中的组成是很丰富的:属性、方法、构造方法、实现接口、继承抽象类,这些功能枚举都具备。
【举例】:定义其他结构
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
for(Color c:Color.values()){
System.out.println(c.name()+c.ordinal()+c);
}
}
}
enum Color{
RED("红色"),GREEN("绿色"),BLUE("蓝色");
private String title;
private Color(String title) {
this.title = title;
}
@Override
public String toString() {
return "Color{" +
"title='" + title + ''' +
'}';
}
}
除了可以定义一些基本结构外,枚举也可以实现接口。对于接口的实现有两种模式:
【举例】:统一实现接口
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IMessage msg = Color.RED;
System.out.println(msg.getColor());
}
}
enum Color implements IMessage{
RED("红色"),GREEN("绿色"),BLUE("蓝色");
private String title;
private Color(String title) {
this.title = title;
}
@Override
public String toString() {
return "Color{" +
"title='" + title + ''' +
'}';
}
@Override
public String getColor() {
return this.title;
}
}
interface IMessage{
public String getColor();
}
【举例】:每个枚举对象采用匿名内部类形式实现
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IMessage msg = Color.RED;
System.out.println(msg.getColor());
}
}
enum Color implements IMessage{
RED("红色"){
public String getColor() {
return "红色";
}
},GREEN("绿色"){
public String getColor() {
return "绿色";
}
},BLUE("蓝色"){
public String getColor() {
return "蓝色";
}
};
private String title;
private Color(String title) {
this.title = title;
}
@Override
public String toString() {
return "Color{" +
"title='" + title + ''' +
'}';
}
}
interface IMessage{
public String getColor();
}
枚举中还可以定义抽象方法,实际上开发基本不会用~~包括以上的其他结构,了解即可,尽量不用。
4、枚举的实际应用
枚举就是表示一个类的对象选用范围,下面定义一个人的类,里面有性别。
【举例】:实现枚举的应用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println(new Person("张三",10,Sex.MALE));
}
}
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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + ''' +
", age=" + age +
", sex=" + sex +
'}';
}
}
以上代码不使用枚举也可以实现,所以,开发中没有对枚举使用的强制限制,看个人习惯,熟悉C语言的可能会比较喜欢用。
5、总结
1)enum宇Enum类的关系;
2)枚举与多例设计模式的关系。
- HDU 3595 GG and MM(Every-SG)
- CSS布局(四) float详解
- php http_build_query 拼接数组 可以用这个函数
- 神器Pytorch(1)
- PHP中的Array2String & String2Array
- CSS布局(五) 网页布局方式
- CSS布局(六) 对齐方式
- css渲染(一) 字体
- css渲染(二) 文本
- BZOJ 2463: [中山市选2009]谁能赢呢?(智商)
- excel导入与导出
- 【LeetCode 204】关关的刷题日记40 Number of Boomerangs
- 洛谷P1339 [USACO09OCT]热浪Heat Wave(最短路)
- excel导出类
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- PHP PDOStatement::debugDumpParams讲解
- PDO::prepare讲解
- sklearn的predict_proba使用说明
- 如何使用python记录室友的抖音在线时间
- 使用keras实现BiLSTM+CNN+CRF文字标记NER
- 图解MyBatis的SQL执行流程
- Keras: model实现固定部分layer,训练部分layer操作
- 在Keras中CNN联合LSTM进行分类实例
- DeepWalk:图网络与NLP的巧妙融合
- PHP扩展mcrypt实现的AES加密功能示例
- PHP PDOStatement::bindColumn讲解
- PHP PDOStatement::fetchAll讲解
- PHP PDOStatement::bindParam讲解
- PHP date()格式MySQL中插入datetime方法
- Python sklearn中的.fit与.predict的用法说明