2013-12-06 6 views
0

Я пытаюсь создать «устройство чтения плоских файлов». Эти файлы будут иметь несколько связанных столбцов, таких как «Имя клиента», «Телефон» и т. Д., Но номер столбца будет отличаться для каждого плоского файла; Кроме того, некоторые плоские файлы будут иметь столбцы, которые другие нет.Должен ли я использовать 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. Там будет широкий множество классов плоских файлов, и я хотел бы, чтобы каждый наследовал одно и то же перечисление, чтобы он был последовательным; проблема в том, что некоторые файлы не будут иметь определенных столбцов. Поэтому я не могу выполнять NAME, TELEPHONE, PAYMENT в родительском классе (или интерфейсе), если FlatFileB не имеет столбца TELEPHONE.

Как я могу решить эту проблему? Это как EnumSet используется? Может ли каждый дочерний класс создавать EnumSet и добавлять только константы, которые ему нужны? Если бы я создал EnumSet и добавил только NAME и PAYMENT, теперь у PAYMENT будет значение 1 (внутри EnumSet) или у него все еще будет значение 2?

ответ

1

EnumSet - это еще одна реализация интерфейса Set. Реализация интерфейса Set означает, что он ведет себя так же, как и Set, как и любая другая реализация. Разница заключается в производительности, принятых значениях и порядках итерации.

Преимущество EnumSet - скорость, недостатком является то, что EnumSets может иметь только константы перечисления в качестве членов. Поскольку каждая константа enum имеет порядковый номер(), основанный на нуле, EnumSet использует представление битовой строки, где каждый бит представляет наличие/отсутствие элемента в наборе. Выбор EnumSet make содержит (All), add (All), remove (All) и сохранение (All) выполняется намного быстрее, чем для TreeSet и HashSet.

И нет, константа перечисления никогда не меняет свой порядковый номер() (хотя я не уверен, что это было то, что вы имели в виду).

0

Я бы предложил ArrayList, так как ваши столбцы находятся в последовательности. Я бы также рекомендовал использовать объекты ArrayList объектов, которые инкапсулируют 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)); 
...  
Смежные вопросы