0

我正在尝试构建一个“平面文件阅读器”。这些文件将有几个相关的列,例如“客户名称”、“电话”等,但每个平面文件的列号会有所不同;此外,一些平面文件将包含其他文件没有的列。

我希望 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?

4

2 回答 2

1

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

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

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

于 2013-12-06T00:45:00.117 回答
0

我会建议ArrayList你的列是按顺序排列的。我会进一步建议您使用ArrayList封装 a 的对象Column以及有关如何从记录中收集列的详细信息。

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));
...    
于 2013-12-06T01:03:33.937 回答