java枚举的使用, 常量与枚举的区别

public enum Light {
        RED, GREEN, YELLOW;
}


我们只能够表示出红灯、绿灯和黄灯,但是具体的值我们没办法表示出来。

 别急,既然枚举类型提供了构造函数,我们可以通过构造函数和覆写toString方法来实现

首先给Light枚举类型增加构造方法,然后每个枚举类型的值通过构造函数传入对应的参

数, 同时覆写toString方法,在该方法中返回从构造函数中传入的参数,代码如下:

public enum Light {
    RED("红灯"), GREEN("绿灯"), YELLOW("黄灯");

    private String code;

    private Light(String code) {
        this.code = code;
    }


//    @Override
//    public String toString() {
//        return String.valueOf(this.code);
//    }
}

 class EnumTest{
     public static void main(String[] args) {
         System.out.println("============演示枚举类型的遍历:");
         testListEnum();

     }
     static void  testListEnum(){
         Light[] allLight = Light.values();
         for (Light light:allLight) {
             System.out.println("当前灯name:"+light.name());
             System.out.println("当前灯顺序:"+light.ordinal());
             System.out.println("当前灯:"+light);
         }
     }
}



常量和枚举的区别:

public interface ConstInterfaceA {  
  public static final String CONST_A = "aa";  
  public static final String CONST_C = "ac";  
}



存在问题:

1) 无法限制开发员继承/实现接口.

2) 常量作为参数时,是String,int等弱类型,开发员传入没有在常量接口里定义的值,这个问题无法通过编译器发现.

3) 由于开发员可以直接写常量值, 所以不能用==对比,只能用equals对比,不能优化性能

4) 编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类,因为里面存的是旧值.

public class ConstClassA {  
  public static final String CONST_A = "aa";  
  public static final String CONST_C = "ac";  
  
  private ConstClassA() {  
  }  
}



常量类可以设置构造函数为private,从而限制继承,也就没有继续添加常量的问题了.

但是其他问题与常量接口一样无法解决!


枚举类型解决了以上所有问题,主要体现在:

1) 私有构造函数,避免被继承和扩展.

2) 定义方法的参数时,必须用枚举常量类类型,如上面的EnumClassA类型,这样就转变成了强类型,不会出现弱类型引起的问题.

3) 常量值地址唯一,可以用==直接对比,性能会有提高.

4) 编译时,没有把常量值编译到代码里,即使常量的值发生变化也不会影响引用常量的类.


转载于:https://my.oschina.net/dyyweb/blog/617493

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值