java枚举后面括号是什么意思_浅谈java枚举类

>>> 学习交流群 < < <

一、什么情况下使用枚举类?

有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便?

二、为什么不用静态常量来代替枚举类?

枚举类更加直观,类型安全。使用常量会有以下几个缺陷:类型不安全。若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。

没有命名空间。开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代表季节。

三、枚举类入口

先看一个简单的枚举类。enum和class、interface的地位一样

使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。

枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。

使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。

枚举类的构造器只能是私有的。

四、枚举类介绍

枚举类内也可以定义属性和方法,可以是静态的和非静态的。

package enumcase;

public enum SeasonEnum {

SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");

private final String name;

private SeasonEnum(String name)

{

this.name = name;

}

public String getName() {

return name;

}

}

实际上在第一行写枚举类实例的时候,默认是调用了构造器的,所以此处需要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。

构造器需定义成私有的,这样就不能在别处申明此类的对象了。枚举类通常应该设计成不可变类,它的Field不应该被改变,这样会更安全,而且代码更加简洁。所以我们将Field用private final修饰。

五、枚举类实现接口

枚举类可以实现一个或多个接口。与普通类一样,实现接口的时候需要实现接口中定义的所有方法,若没有完全实现,那这个枚举类就是抽象的,只是不需显式加上abstract修饰,系统化会默认加上。

package enumcase;

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;

}

},

TIMES{

@Override

public double eval(double x, double y) {

return x * y;

}

},

DIVIDE{

@Override

public double eval(double x, double y) {

return x / y;

}

};

/*** 抽象方法,由不同的枚举值提供不同的实现。* @param x* @param y* @return*/

public abstract double eval(double x, double y);

public static void main(String[] args) {

System.out.println(Operation.PLUS.eval(10, 2));

System.out.println(Operation.MINUS.eval(10, 2));

System.out.println(Operation.TIMES.eval(10, 2));

System.out.println(Operation.DIVIDE.eval(10, 2));

}

}

Operatio类实际上是抽象的,不可以创建枚举值,所以此处在申明枚举值的时候,都实现了抽象方法,这其实是匿名内部类的实现,花括号部分是一个类体。我们可以看下编译以后的文件。

共生成了五个class文件,这样就证明了PLUS,MINUS,TIMES,DIVIDE是Operation的匿名内部类的实例。

六、switch语句里的表达式可以是枚举值

Java5新增了enum关键字,同时扩展了switch。

package enumcase;

public class SeasonTest {

public void judge(SeasonEnum s)

{

switch(s)

{

case SPRING:

System.out.println("春天适合踏青。");

break;

case SUMMER:

System.out.println("夏天要去游泳啦。");

break;

case FALL:

System.out.println("秋天一定要去旅游哦。");

break;

case WINTER:

System.out.println("冬天要是下雪就好啦。");

break;

}

}

public static void main(String[] args) {

SeasonEnum s = SeasonEnum.SPRING;

SeasonTest test = new SeasonTest();

test.judge(s);

}

}

case表达式中直接写入枚举值,不需加入枚举类作为限定。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值