前言
Kotlin作为JVM系的语言,起源于Java又不同于Java。通过在语言层面比较两者的区别,可以使得开发者能够快速学习,融会贯通。
枚举使用场景
使用枚举的场景非常明确,即只要一个类的对象是有限且固定的,就可以使用枚举。枚举常常会与常量做比较,它们有着若干的区别:
简单的枚举类
通过enum关键字来定义枚举类,且没有class关键字:public enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER
非抽象的枚举类默认使用final修饰,不可以被继承。且其构造函数只能是私有的。
Kotlin
通过enum class关键字来定义枚举:
enum class Direction {
NORTH, SOUTH, WEST, EAST
传入参数的枚举类
public enum SeasonEnum {
SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天"); //需要添加分号
private final String name
private SeasonEnum(String na;me)
this.name = name;
public String getName() {
return name;
在该例中,可以向枚举对象的构造方法中传入参数。在枚举类中若有成员变量或方法,需要在枚举对象列表末尾添加分号。
Kotlin
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
在枚举类中传入主构造函数的参数。
枚举继承接口
public enum Operation {
PLUS{
@Override
public double eval(double x, double y) {
return x + y;
MINUS{
@Override
public double eval(double x, double y) {
return x - y;
//抽象方法,由枚举对象实现
public abstract double eval(double x, double y);
枚举类的抽象方法,写在枚举类的类体中。枚举对象后添加对于该接口中抽象方法的实现。
Kotlin
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
TALKING {
override fun signal() = WAITING
abstract fun signal(): ProtocolState
Kotlin的是实现方式与Java几乎一致,只是一般情况下Kotlin中都不用添加分号,而此时需要在枚举对象后添加分号。
Kotlin不仅可以实现自身的抽象方法,还可以实现外部其他接口的抽象方法:
enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
PLUS {
override fun apply(t: Int, u: Int): Int = t + u
TIMES {
override fun apply(t: Int, u: Int): Int = t * u
override fun applyAsInt(t: Int, u: Int) = apply(t, u)
即抽象方法不是在枚举类中定义的,而是在其他接口中定义的。
枚举类常用方法
在Java中提供了values()方法用于返回枚举类的对象集合,常用于迭代枚举对象:
for(ColorEnum temp:ColorEnum.values()){
System.out.println(temp);
同时也提供了通过常量名获取枚举对象的方法valueOf:
ColorEnum red = ColorEnum.valueOf("RED");
Kotlin
Kotlin也提供了类似的方法,假设枚举名为EnumClass:
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>