ITEEDU

避免列举类型Avoid Enums

列举类型非常好用,当考虑到尺寸和速度的时候,就会显得代价很高,例如:

public class Foo {
   public enum Shrubbery { GROUND, CRAWLING, HANGING }
}

这会转变成为一个900字节的class文件(Foo$Shrubbery.class)。第一次使用时,类的初始化要在独享上面调用方法去描述列举的每一项,每一个对象都要有它自身的静态空间,整个被储存在一个数组里面(一个叫做“$VALUE”的静态数组)。那是一大堆的代码和数据,仅仅是为了三个整数值。

Shrubbery shrub = Shrubbery.GROUND;

这会引起一个静态属性的调用,如果GROUND是一个静态的Final变量,编译器会把它当做一个常数嵌套在代码里面。

还有一点要说的,通过列举,你可以得到更好地API和一些编译时间上的检查。因此,一种比较平衡的做法就是:你应该尽一切方法在你的公用API中使用列举型变量,当处理问题时就尽量的避免。

在一些环境下面,通过ordinal()方法获取一个列举变量的整数值是很有用的,例如:把下面代码

for (int n = 0; n < list.size(); n++) {
    if (list.items[n].e == MyEnum.VAL_X)
       // do stuff 1
    else if (list.items[n].e == MyEnum.VAL_Y)
       // do stuff 2
}

替换为:

   int valX = MyEnum.VAL_X.ordinal();
   int valY = MyEnum.VAL_Y.ordinal();
   int count = list.size();
   MyItem items = list.items();

   for (int  n = 0; n < count; n++)
   {
        int  valItem = items[n].e.ordinal();

        if (valItem == valX)
          // do stuff 1
        else if (valItem == valY)
          // do stuff 2
   }

在一些条件下,这会执行的更快,虽然没有保障。