我正在尝试构建一个"平面文件读取器"。这些文件将有几个相关的列,如"客户名称"、"电话"等,但每个平面文件的列号不同;此外,一些平面文件将具有其他平面文件没有的列。
我希望这些不同的文件中的每一个都能被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的优点是速度,缺点是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));
...