单例模式以及枚举的异同
相同点:同样是类中有固定的对象个数
不同点:单例模式只有一个对象,枚举是有限个对象,但对象只有一个时,也可以叫做单例模式
单例模式实现
单例模式有七种实现方式,但本质上是让让类只能创建一个对象,为了保证这个,只能在类内部创建对象,而在类外部外部无法创建,所以构造器是空的
给出两种实现方式:
//饿汉式:提前创建好对象
class Single{
private Single(){
}
private static Single instance=new Single();//构造器必须私有
public static Single getInstance() {
return instance;
}
}
//懒汉式:调用时才创建
class Single2{
private static Single2 instance=null;//构造器必须私有
private Single2() {
}
public static Single2 getInstance() {
if(instance==null) {
instance=new Single2();
}
return instance;
}
}
枚举
自定义枚举
- 构造器私有化
- 在类内部创建的实例是 public static final
- 若类有属性,那么属性声明为:private final ,此属性在构造器中赋值。
- 先来一个最简单的版本
enum Seasons {
SPRING,//创建四个实例,注意是逗号,
SUMMER,
AUTMN,
WINTER;
/*private Seasons(){
}*/
}
枚举类如何实现接口 :①让类实现此接口,类的对象共享同一套接口的抽象方法的实现。
①让类的每一个对象都去实现接口的抽象方法,进而通过类的对象调用被重写的抽象方法时,执行的效果不同
interface Info{
void show();
}
enum Seasons implements Info {
SPRING("春天","万象初新"){
public void show() {
System.out.println("风乍起,吹皱一池春水");
};
},//创建四个实例,注意是逗号,
SUMMER("夏天","生如夏花"){
public void show() {
System.out.println("接天莲叶无穷碧,映日荷花别样红");
}
},
AUTMN("秋天","秋高气爽"){
public void show () {
System.out.println("人生若只如初见,何事秋风悲画扇");
}
},
WINTER("冬天","冬日可爱"){
public void show () {
System.out.println("忽如一夜春风来,千树万树梨花开");
}
};
private final String seasonName;
private final String seasonDesc;
private Seasons(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("春夏秋冬");
}
@Override
public String toString() {
return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
}
}
调用方式
public static void main(String[] args) {
Season spring =Season.SPRING;
System.out.println(spring);
System.out.println(spring.getSeasonName());
System.out.println();
//1.values()
Season[] seasons=Season.values();
for (int i = 0; i < seasons.length; i++) {
System.out.println(seasons[i]);
}
//valueOf(String):要求是形参的名字
System.out.println(Season.valueOf("SPRING"));
}
输出