我应该使用EnumSet吗?

时间:2013-12-06 00:33:01

标签: java enums enumset

我正在尝试构建一个"平面文件阅读器。"这些文件将包含多个相关列,例如"客户名称","电话,"等,但每个平面文件的列号不同;此外,一些平面文件将包含其他人不知道的列。

我希望FlatFileReader类可以读取这些不同的文件。所以我为第一个平面文件创建了一个枚举,其中值是数组的索引。

enum Columns { NAME, TELEPHONE, PAYMENT }
...
String[] columns = new String[3];
columns[0] = line.substring(0,29); //Name
columns[1] = line.substring(30,36); //Telephone
columns[2] = line.substring(37); //Payment

因此,为了从平面文件中获取名称,FlatFileReader将调用该方法:

file.get (Columns.NAME);

和FlatFileA将寻找索引0.这将是各种各样的平面文件类,我希望每个人都继承相同的枚举,以便它是一致的;问题是某些文件没有某些列。因此,如果FlatFileB没有TELEPHONE列,我就无法在父类(或界面)中进行NAME,TELEPHONE,PAYMENT。

我怎么能解决这个问题?这是使用EnumSet的方式吗?每个子类都可以创建一个EnumSet并只添加它需要的常量吗?如果我创建了一个EnumSet并且只添加了NAME和PAYMENT,那么PAYMENT现在的值是否为1(在EnumSet中)还是仍然具有值2?

2 个答案:

答案 0 :(得分:1)

EnumSet只是Set接口的另一个实现。实现Set接口意味着它的行为与Set一样多,与其他任何实现一样多。不同之处在于性能,可接受的值和迭代顺序。

EnumSet的好处是速度,缺点是EnumSets只能将枚举常量作为成员。由于每个枚举常量具有从零开始的序数(),因此EnumSet使用位串表示,其中每个位表示集合中元素的存在/不存在。选择EnumSet使包含(All),add(All),remove(All)和retain(All)运行速度比TreeSet和HashSet快得多。

不,枚举常量永远不会改变它的序数()(虽然我不确定这是否是你的意思)。

答案 1 :(得分:0)

我建议ArrayList,因为您的列在序列中。我还建议您使用封装ArrayList的{​​{1}}个对象以及有关如何从记录中收集列的详细信息。

Column