面试官问:枚举是一个接口还是一个类?
答:枚举是一个标识类,枚举本身继承自java.lang.Enum.
//通过Class文件可以看出来
public final enum Level extends java/lang/Enum {
}
System.out.println(Level.class.getSuperclass());//输出class java.lang.Enum
面试官问:枚举默认提供了哪些静态方法?
答:
1.name();//获取枚举的名称
2.ordinal();//获取枚举在枚举列表中的索引号从0开始
3.valueOf();//通过名称获取一个枚举
面试官问:枚举支持序列化与反序列化吗?
答:支持。
面试官问:枚举和接口的区别?
答:枚举可以有带多个参数的构造,枚举可以有类的特性,而接口没有。
面试官问:枚举是否通过反射创建一个枚举对象吗?
答:不能,因为JAVA中的Constructor#newInstance(Object ... initargs有约束。利用枚举实现单例模式并能保证安全性。
if ((clazz.getModifiers() & Modifier.ENUM) != 0)
throw new IllegalArgumentException("Cannot reflectively create enum objects");
面试官问:列举几个枚举在JDK中的应用?
答:EnumMap,EnumSet.
面试官问:枚举可以适用于哪些设计模式?
答:单例模式,策略模式,工厂模式。
面试官问:枚举既然是一个类,那么它可以被继承吗?
答:枚举不能被继承,编译不允许。
枚举工厂模式代码示例:
public enum EnumFactory {
BUICK {
@Override
public Car build() {
return new BUICKCar();
}
},
CADILAC {
@Override
public Car build() {
return new CADILACCar();
}
},
CHEVY {
@Override
public Car build() {
return new CHEVYCar();
}
};
protected abstract Car build();
interface Car {
/**
* 品牌描述
*
* @return
*/
String brandDesc();
}
class BUICKCar implements Car {
@Override
public String brandDesc() {
return "别克是通用系列的中档车";
}
}
class CADILACCar implements Car {
@Override
public String brandDesc() {
return "凯迪拉克是通用系列的高档车";
}
}
class CHEVYCar implements Car {
@Override
public String brandDesc() {
return "雪佛兰是通用系列的低档车";
}
}
}
枚举实现的策略模式代码示例:
public enum Strategy
{
ONE("策略①",new ONE()),
TWO("策略②",new TWO());
//构造
IStrategy st;
Strategy(IStrategy st){
this.st=st;
}
//获取Strategy
public IStrategy getStrategy(){
return st;
}
}
枚举单例模式代码示例:
public enum Singleton {
INSTANCE(new SingletonObject());
private SingletonObject singletonObject;
Singleton(SingletonObject singletonObject){
this.singletonObject=singletonObject;
}
public SingletonObject getSingletonObject() {
return singletonObject;
}
private static class SingletonObject{
public String getName(){
return "程序员很伟大!";
}
}
public static void main(String[] args) {
System.out.println(Singleton.INSTANCE.getSingletonObject().getName());
System.out.println(Singleton.INSTANCE.getSingletonObject());
System.out.println(Singleton.INSTANCE.getSingletonObject());
}
}