比较一类常量的String值

时间:2012-04-18 17:34:03

标签: java string-comparison

我的任务是创建一个针对我们的Constants类运行的测试,以确保类中的每个值都是唯一的。我不是在谈论常量名称(IDE会告诉开发人员是否重复这些名称),而是将常量设置为值。

我是Java新手,不确定如何做到这一点。

为清楚起见,我的Constants类定义如下:

public static final String STATUS_RECEIVED = "RE";
public static final String STATUS_CANCELLED = "CA";
public static final String STATUS_REVIEWED = "RE";

在上面的例子中,我希望我的测试注意到有一个重复的值(因为STATUS_RECEIVED == STATUS_REVIEWED)。我该如何以编程方式执行此操作?

6 个答案:

答案 0 :(得分:2)

迭代所有常量的字符串值,如果它们不在集合中,则将它们粘贴在集合中。如果它们已经在集合中,则测试失败。

或者你可以将副本粘贴到一个不同的集合中,并对那组重复项进行测试是空的 - 每次运行测试时都会给你一个重复列表(而不是重新运行测试直到你删除所有重复项。)

答案 1 :(得分:2)

Field[] fields = Constants.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<>();
for(Field f:fields) {
  if (Modifier.isStatic(f)) {
    staticFields.add(f);
  }
}
for (int i = 0; i < staticFields.size(); i++) {
  for (int j = i + 1; j < staticFields.size(); j++) {
    if (staticFields.get(i).get(null).equals(staticFields.get(j).get(null))) {
      throw new AssertionFailedError(staticFields.get(i) + " equals " 
        + staticFields.get(j));
    } 
  }
}

答案 2 :(得分:1)

您可以发现字段,然后检查唯一性(例如将它们放在树形图中,然后计数)。

public void test() throws Exception {
    for (Field f : ConstantsClass.class.getDeclaredFields()) {
        System.out.println(f.getName() + ": " + f.get(null));
    }
}

取自Accessing Java static final ivar value through reflection

答案 3 :(得分:1)

使用java.lang.Class.getFields(),遍历数组,获取每个值(使用Field.get(null)),检查它是否已经存在于Set中,并将其存储在Set中(如果它已经存在)。

答案 4 :(得分:0)

如果你使用枚举,你的生活将会轻松许多。然后,您可以选择使成员名称与所需值匹配

enum Status {
RE,CA,RE;
}

在这种情况下,编译器保证它们是唯一的,或将值存储为属性

enum Status {
  averbosenamedescribingwhatremeans("RE") 
  etc, etc

  private final String statusCode;

  Status(String code) {
  this.statusCode = code;
  }  
}

您可以使用枚举提供的values()方法轻松检查单元测试中代码的唯一性。

另外,你会有类型安全的代码。

使用您当前的方法,您需要通过反射查询该类。

答案 5 :(得分:0)

考虑将ConstantsEnum保持当前String值。类似的东西:

public enum Constants {

    STATUS_RECEIVED("RE"),
    STATUS_CANCELLED("CA"),
    STATUS_REVIEWED("RE")

    private String value;

    public Constants(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

然后,您的测试可能会迭代每个value常量的Enum字段,如果该值已经存在则会失败例如:

public void testConstantValueUniqueness() {
    Set<String> values = new HashSet<String>();
    for(Constants constant : Constants.values()) {
        if(values.contains(constant.getValue())) {
            // fail
        }
        values.add(constant.getValue());
    }
}