Как заменить устаревшие побитовые операции флагов и констант на Enums в Java? - PullRequest
1 голос
/ 26 апреля 2011

Привет,

Я пришел к устаревшему коду в C ++, который использует флаг и позже обновляет статус флага на основе выполненных операций чтения:

Основной файл:

#define VINCULACION                 0x00000004L
#define DET_VINCULACION             0x00000008L

long unsigned FlagRead ;

int formerMethod(){
if ((FlagRead & VINCULACION)==0) ReadVinculacion();
//... DO MORE
}

int ReadVinculacion(){
//.. Do DB operations to read Vinculacion variables.
FlagRead|=VINCULACION;
  return 1;
}

//.. Same similar methods to ensure reading DET_VINCULACION but not doing it twice.

Сейчас, работая на Java, я не использую константы с целыми числами или Longs, так как это хорошая практика для использования перечислений.

Есть ли эффективный и надежный способ выполнить ту же задачу, используя перечисления в java?.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 26 апреля 2011

Взгляните на использование EnumSet для замены переменной FlagRead в коде C ++:

Наборы перечислений представляются внутри как битовые векторы. Это представление чрезвычайно компактно и эффективно. Пространственно-временные характеристики этого класса должны быть достаточно хорошими, чтобы его можно было использовать в качестве высококачественной, безопасной для типов альтернативы традиционным "битовым флагам" на основе int.

Затем вы можете проверить, следует ли выполнять определенные операции, используя set.contains(YourEnum.SOME_VALUE)

0 голосов
/ 26 апреля 2011

Привет,

Я создал для каждого предложения один файл Enum: Constants.java

public enum Constantes {

  VINCULACION,

  DET_VINCULACION;
}

Тогда на Main.java:

private final EnumSet<Constantes> flagRead;

public boolean needsToRead(Constantes constantParameter) {
    return (flagRead.contains(constantParameter)  == false);
  }

public void markAsRead(Constantes constantParameter){
    flagRead.add(constantParameter);
  }

Хотя тогда необходимо проверить, прочитан ли набор информации о переменной или нет, я делаю следующие проверки в файле Process.java:

.

частный Main m = новый Main ();

public int newMethod(){
if (m.needsToRead(Constantes.VINCULACION)){
 ReadVinculacion();
}
//... DO MORE
}

public void readVinculacion(){
//.. Do DB operations to read Vinculacion variables.
m.markAsRead(VINCULACION);
}

Я выполнил базовые юнит-тесты и запустил тесты, и они работали для имитации необходимого Процесса.

Спасибо!

...