枚举类的使用-使用实例域来替代序数

博客指出许多枚举与单独int值关联,使用ordinal方法获取关联值会带来维护难题,如常量重排序、新增常量绑定已使用值、未为所有int值添加常量等问题。幸运的是,可通过实例域保存绑定值来解决这些问题。

许多枚举都与一个单独的int值进行了关联。所有的枚举都有ordinal方法,这个方法返回了每个枚举常量的位置。你也许会试着从ordinal方法里获取得到一个关联的int值:

public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET;
    public int numberOfMusicians() { 
        return ordinal() + 1; 
    } 
}

虽然这个枚举可以正常使用,但是它的维护却将是一场噩梦。如果对常量进行重排序,那么getNum方法将被破坏。如果你想再增加一个常量,并且让这个新的常量与一个已经被使用了的int值进行绑定,那也是不行的。例如,你想为双四重奏增加一个常量,而它却像八重奏一样,有8个演奏者,那么此时你也是无法做到让numberOfMusicians返回8的。

同样,若是没有为所有涉及到的int值添加常量,你也是无法为某个int值添加常量的。例如,假设你想增加一个常量用来表示一个由12个演奏者组成的三重奏。由于没有由11个演奏者组成合奏组的标准,那么此时你不得不为一个用不到的int值(11)添加一个虚拟的常量。这么做顶多就只是显得不优雅。但如果有大量的int值都是用不到的,那么这么做就不切实际了。

幸运的是,有个简单的办法可以解决这些问题。那就是,永远都不要经过某个枚举的ordinal方法来获取它的绑定值,而是要将这个值通过一个实例域来进行保存:

public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), 
    SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8), 
    NONET(9), DECTET(10), TRIPLE_QUARTET(12);
​
    private final int numberOfMusicians;
    Ensemble(int size) { 
        this.numberOfMusicians = size; 
    }
    public int numberOfMusicians() { 
        return numberOfMusicians; 
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值