目录
1、多例设计模式与枚举
2、java.lang.Enum类
3、枚举结构定义
4、枚举的实际应用
5、总结
多例设计模式一定是构造方法私有化,而后在内部类种产生若干个实例化对象。
【举例】:定义颜色基色的多例模式
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);
}
使用enum定义的枚举类不属于一个新的结构,本质上相当于一个类继承了java.lang.Enum类的形式,观察下Enum类的定义形式:
public abstract class Enum |
Enum类中定义的构造方法:
protected Enum(String name, int ordinal) |
protected 权限表示只能在本包或不同包的子类才可以调用,其实就是构造方法的封装。该构造方法中第一个参数表示对象名字,第二个表示对象序号。
Enum类中有两个方法,可以取得名字和序号:
for(Color c:Color.values()){
System.out.println(c.name()+c.ordinal());
}
枚举中的序号是根据对象的定义顺序来的。
【面试题】:请解释Enum与enum的区别?
枚举在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();
}
枚举中还可以定义抽象方法,实际上开发基本不会用~~包括以上的其他结构,了解即可,尽量不用。
枚举就是表示一个类的对象选用范围,下面定义一个人的类,里面有性别。
【举例】:实现枚举的应用
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语言的可能会比较喜欢用。
1)enum宇Enum类的关系;
2)枚举与多例设计模式的关系。
本文为博主原创文章,转载请注明出处,若本文对您有些许帮助,关注/评论/点赞/收藏,就是对我最大的支持,多谢!