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

许多枚举都与一个单独的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; 
    }
}

猜你喜欢

转载自blog.csdn.net/fy_java1995/article/details/93488021