如何更换Legacy Flag&使用Java中的Enums进行按位运算?

时间:2011-04-25 22:49:50

标签: java enums bitwise-operators flags

问候,

我找到了一个使用Flag的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开发我没有使用带有整数或长整数的常量作为使用枚举的好习惯。

在java下使用枚举执行相同任务是否有性能明智且可靠的方法?

谢谢!

2 个答案:

答案 0 :(得分:6)

看一下使用EnumSet代替C ++代码中的FlagRead变量:

  

枚举集在内部表示为位向量。这种表现非常紧凑和高效。这个类的空间和时间性能应该足以使其成为传统的基于int的“位标志”的高质量,类型安全的替代品。

然后,您可以使用set.contains(YourEnum.SOME_VALUE)

测试是否应执行某些操作

答案 1 :(得分:-1)

问候,

我创建了每个建议,一个枚举文件: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中进行下一次检查:

private Main m = new 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);
}

我做了基本单元并运行测试,它可以模拟所需的过程。

谢谢!