java SE -- enum 的使用
1.构造器
枚举类也有构造器,默认是 private 修饰的,并且也只能是 private。观察这段代码:
public enum Week {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
Week(){
System.out.println("hello");
}
}
class Test{
public static void main(String[] args) {
Week friday = Week.SUNDAY;
}
}
我们调用之后发现,其实此类的枚举项的创建,就相当于其他类调用无参构造器 new 出来的对象,也就是这个枚举类创建了7次实例,所以输出了7个 hello。
" hello hello hello hello hello hello hello "
有参构造器
public enum Week {
SUNDAY(1);
Week( int num){
System.out.println("hello"+num);
}
}
// hello1
2.枚举类成员
枚举类和正常类一样,也可以有成员变量、实例方法、静态方法。
当然还有抽象方法。
public enum Week {
SUNDAY(1){ // 实际上就是内部类
@Override
public void getDayNum() {
System.out.println("星期日");
}
},
WEDNESDAY(1){
@Override
public void getDayNum() {
System.out.println("星期三");
}
};
// 抽象方法
public abstract void getDayNum();
Week( int num){
System.out.println("hello"+num);
}
}
3.values()、valueOf(String name) 方法
-
static Direction[ ] values():返回本类所有枚举常量实例;
-
static Direction valueOf(String name):通过枚举常量的名字返回Direction常量实例,注意,这个方法与Enum类中的valueOf()方法的参数个数不同。
class Test{
public static void main(String[] args) {
for (Week value : Week.values()) {
value.getDayNum();
}
Week.valueOf("WEDNESDAY").getDayNum();
}
}
" 星期日 "
星期三
星期三
4.枚举的用法
1.消除if/else
public interface Eat {
//吃
void eat();
}
public enum AnimalEnum implements Eat{
Dog(){
@Override
public void eat() {
System.out.println("狗吃骨头");
}
},
Cat(){
@Override
public void eat() {
System.out.println("猫吃鱼");
}
},
Sheep(){
@Override
public void eat() {
System.out.println("羊吃草");
}
}
}
class Test{
public static void main(String[] args) {
AnimalEnum sheep = AnimalEnum.valueOf("Sheep");
sheep.eat();
}
}
2.单例模式中应用
public class SingletonExample {
/**
* 构造函数私有化,避免外部创建实例
*/
private SingletonExample(){}
private static SingletonExample getInstance() {
return Singleton.INSTANCE.getInstance();
}
private enum Singleton {
INSTANCE;
private SingletonExample instance;
// JVM 保证这个方法绝对只调用一次
Singleton() {
instance = new SingletonExample();
}
public SingletonExample getInstance() {
return instance;
}
}
}