类型安全枚举

这种设计在 JDK 类库中有许多。比如:Color.BLACK、
Color.WHITE 等等,大家可以看看它们的 API DOC,会注意到它们的类型就是一
个 Color 类型的常量。我们可以很方便的在代码中运用这个常量作为参数传入到
Color 类型的方法参数中。

Color 这种设计称为“类型安全枚举(typesafe enum)”,是由 Joshua Bloch
在 Effective Java 中提出的,据 Joshua Bloch 所称,这种设计技巧很有用,
但知道的人并不是很多。

在 JDK 5.0 版本以前的类库中都是采用这种设计的。从 JDK 5.0 开始,由于增加了
enum 语言特性,新增的类库都是采用这种方式来实现的了。

对于这个题,我们不能把方法的参数类型限死在数值类型上,参数必须进行重新设计。
按照类型安全枚举的思想,需要将这个参数设计成为一个类,并在这个类中存放多个
该类型的常量值,以作为方法参数,具体的实现代码如下:

        public static void main(String[] args) {
            test(Param.PARAM_5);
            test(Param.PARAM_2);
        }

        private static void test(Param param) {
            int n = param.getNum();
            System.out.println("传入的值是:" + n);
        }
    }

    class Param {
        private static int i = 0;
        private int num = ++i;
        public static Param PARAM_1 = new Param();
        public static Param PARAM_2 = new Param();
        public static Param PARAM_3 = new Param();
        public static Param PARAM_4 = new Param();
        public static Param PARAM_5 = new Param();
        public static Param PARAM_6 = new Param();
        public static Param PARAM_7 = new Param();
        public static Param PARAM_8 = new Param();
        public static Param PARAM_9 = new Param();
        public static Param PARAM_10 = new Param();

        private Param() {
        }

        public int getNum() {
            return num;
        }
    }

我们重新设计了一个 Param 类,设置了 10 个该类型的静态常量,通过其私有
属性 num 保存它所表示的数值。由于声明了 private 的无参构造,因此我们
也不能对其进行扩展,要产生 Param 的实例,只有那 10 个静态常量。这样我
们只要把方法的参数类型改为 Param 就可以了。

由于不存在其他的 Param 的实例,在传入非法参数时由于不是 Param 的实例,
在编译期就会产生错误。

之所以要限定为 JDK 1.4,因为在 JDK 5.0 版本以下只能采用这种办法来解决
这个问题。

在 JDK 5.0 中,我们可以很方便地用 enum 来实现 Param,作为对比,下面是
由 enum 实现的 Param,当然了,我们的测试类是不需要更改的。
enum Param {
        PARAM_1(1),
        PARAM_2(2),
        PARAM_3(3)
        PARAM_4(4), 
        PARAM_5(5), 
        PARAM_6(6),
        PARAM_7(7),  
        PARAM_8(8),
        PARAM_9(9),
        PARAM_10(10);
        private int num;

        Param(int num) {
            this.num = num;
        }

        public int getNum() {
            return this.num;
        }
    } 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值