Java 的枚举(Enums) 可以实现接口(Interfaces)
Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。
枚举类型,看似字符串值,但包含一些附加的信息,包括排序以及附加的方法可以获取枚举值的信息。
下面是一个基本的枚举类型:
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
可增加附加信息,例如私有构造器、私有属性等,如下:
pubilc enum Number {
One(1), Two(2), Three(3);
private Number( int value){
this.value = value;
}
public int getValue(){
return this.value;
}
private int value;
}
在上面的例子中,引入了 getValue() 方法,这便是枚举的行为定义。
可以在其他类中调用定义的方法
public enum PayCodeEnum {
// 利用构造函数传参
ALIPAY("1"), NONE_MOBILE_EBPAY("2"), MOBILE_EBPAY("3"),
// 定义私有变量
private String code;
// 构造函数
PayCodeEnum(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public static PayCodeEnum getPayCodeEnumByCode(String code) {
for (PayCodeEnum payCodeEnum : PayCodeEnum.values()) {
if (payCodeEnum.getCode().equals(code)) {
return payCodeEnum;
}
}
return null;
}
}
在其他类中调用
if (PayCodeEnum.getPayCodeEnumByCode(payCode) == null) {
return 0;
}
枚举类型对接口的继承以及实际的用途。
枚举类型做一个接口,实现类和数据库表的一个映射:
public enum PersonMapping {
personId("INTEGER", true, false),
firstname("TEXT", false, false),
lastname("TEXT", false, false),
age("INTEGER", false, false);
private PersonMapping(String type, boolean key, boolean nullable )
{
this.type = type;
this.key = key;
this.nullable = nullable;
}
public String getType() {
return type;
}
public boolean isKey() {
return key;
}
public boolean isNullable() {
return nullable;
}
private final String type;
private final boolean key;
private final boolean nullable;
}
现在我们可以使用这个枚举来迭代所有字段并创建相应的表:
public String dbTableCreate(String tableName) {
StringBuilder builder = new StringBuilder("Create table ");
builder.append(tableName);
builder.append("(");
for (PersonMapping column : PersonMapping.values()) {
builder.append(column.name());
builder.append(" ");
builder.append(column.getType());
builder.append(column.isKey() ? " primary key" : "");
builder.append(", ");
}
builder = new StringBuilder(builder.substring(0, builder.length() - 2));
builder.append(");");
return builder.toString();
}
这个 PersonMapping 枚举类型看起来不错,但是它不允许我们使用不同的类到数据库的映射,因此我们需要抽象,需要接口。从上面的代码看,我们需要枚举类型两个通过的方法:name() 和 values(),第一个方法返回当前枚举值的名字,第二个就是列出所有的枚举值。
首先,为枚举添加一个接口:
public enum PersonMapping implements MappingEnum{
....
}
public interface MappingEnum {
public String getType();
public boolean isKey();
public boolean isNullable();
public String name();
}
然后再编写一个 dbTableCreate() 方法来让其他的枚举类型可重用这个方法:
public String dbTableCreate(String tableName, MappingEnum[] values) {
StringBuilder builder = new StringBuilder("Create table ");
builder.append(tableName);
builder.append("(");
for (MappingEnum column : values) {
builder.append(column.name());
builder.append(" ");
builder.append(column.getType());
builder.append(column.isKey() ? " primary key" : "");
builder.append(", ");
}
builder = new StringBuilder(builder.substring(0, builder.length() - 2));
builder.append(");");
return builder.toString();
}
最后总结
枚举类型可以存储附加的数据和方法
枚举类型可通过接口来定义行为
枚举类型的项行为可通过接口来访问,跟正常的 Java 类无异
values() 方法可用来返回接口中的一个数组