Java 的枚举(Enums) 可以实现接口(Interfaces)
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() 方法可用来返回接口中的一个数组
- Java 的枚举(Enums) 可以实现接口(Interfaces)
- Java 的枚举(Enums) 可以实现接口(Interfaces)
- Java深拷贝除了通过实现Cloneable接口,另外还可以通过序列化实现对象的拷贝。
- Java学习笔记之实现Runnable接口可以资源共享(卖票系统)
- java中并不是任意多个接口都可以实现多实现
- 对Java不能多继承,只能单继承,却可以实现多个接口的理解
- Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?【Java面试题】
- Java 枚举:实现接口
- java中的接口为什么可以多继承,而其他类则不能实现多继承
- 【Java面试题】60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?
- Java枚举实现接口
- 匿名内部类是否可以继承其它类是否可以实现接口 _JAVA面试题及答案
- java中接口可以实现多个接口吗?
- 为什么Java语言中,类与类之间只能单根继承,类与接口可以多重实现,接口与接口却多根继承
- 使用函数接口和枚举实现配置式编程(Java与Scala实现)
- 【Java面试题】13 Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
- Effective Java 对于所有对象都通用的方法 12.考虑实现Comparable(可以比较)接口
- Java - Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
- 牛客网Java刷题知识点之Java为什么不能支持多继承,但可以用接口来间接实现多继承
- java 枚举实现接口