我应该使用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、TELEPHOONE、PAYMENT。

我该如何解决这个问题?EnumSet就是这样使用的吗?每个子类是否都可以创建一个EnumSet并只添加它需要的常量?如果我创建了一个EnumSet,只添加了NAME和PAYMENT,那么PAYMENT现在的值是1(在EnumSet内)还是仍然是2?

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

EnumSet的优点是速度,缺点是EnumSet只能将枚举常量作为成员。由于每个枚举常量都有一个基于零的序数(),因此EnumSet使用一个位字符串表示,其中每个位表示集合中元素的存在/不存在。选择EnumSet会使contains(All)、add(All),remove(All)和retain(All)的运行速度比TreeSet和HashSet快得多。

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

我建议使用ArrayList,因为列在序列中。我进一步建议您使用封装Column的对象的ArrayList,以及有关如何从记录中收集列的详细信息。

class Field {
  Columns col;
  int start;
  int length;
}
ArrayList<Field> file1Record = new ArrayList<Field>();
// You could calculate the 0 and 29 on the fly.
file1Record.add(new Field(Columns.NAME, 0, 29));
...    

相关内容

  • 没有找到相关文章

最新更新