在开发阶段如何确保Java类中常量值的唯一性?

在开发阶段如何确保Java类中常量值的唯一性?,java,constants,development-environment,Java,Constants,Development Environment,我们的团队有一个共享的Java类仅用于常量值 任何开发人员需要添加常量时 他将在这个班上增加一个记录 public class Constants_Class { public static final String Constant1 = "value1"; public static final String Constant2 = "value2"; public static final String Constant3 = "value3"; //

我们的团队有一个共享的
Java类
仅用于常量值
任何开发人员需要添加常量时
他将在这个班上增加一个记录

public class Constants_Class {

    public static final String Constant1 = "value1";
    public static final String Constant2 = "value2";
    public static final String Constant3 = "value3";

    // Need to prevent that in Development time - NOT Run time
    public static final String Constant4 = "value1"; // value inserted before

}  
问题是
我们需要在开发时间内阻止任何开发人员
将新常量添加到其前面插入的值
//需要唯一常量值

有什么建议吗

你真的应该使用。这将解决您看到的问题

您还可以将
String
值与枚举关联:

public enum MyEnums {

    Constant1("value1"),
    Constant2("value2"),
    Constant3("value3");

    private String value;

    MyEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return this.value;
    }
}

然后您可以执行MyEnum.Constant1.getValue()

您确实应该使用的操作。这将解决您看到的问题

您还可以将
String
值与枚举关联:

public enum MyEnums {

    Constant1("value1"),
    Constant2("value2"),
    Constant3("value3");

    private String value;

    MyEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return this.value;
    }
}

然后您可以执行
MyEnum.Constant1.getValue()

来执行您在开发时要求的操作,这需要解析代码,本质上是重复编译。因此,让它被编译并创建一个单元测试来执行您的检查是有意义的,然后设置项目以便在每次编译代码库时运行单元测试。我很确定目前最常用的单元测试库是

要轻松检查值的唯一性,可以使用以下方法,如果要添加的项已存在于集合中,则该方法将返回false:

@Test
public class TestConstantUniqueness() {
    Set<String> stringValues = new HashSet<String>();
    for (MyConstantEnum value : MyConstantEnum.values()) {
        String s = value.stringValue();
        Assert.assertTrue(
            "More than one constant in " + MyConstantEnum.class
                + " has the string value \"" + s + "\"",
            stringValues.add(s));
    }
}
@测试
公共类TestConstantUniqueness(){
Set stringValues=newhashset();
对于(myConstantum值:myConstantum.values()){
字符串s=value.stringValue();
Assert.assertTrue(
“+myconstantum.class中的多个常量”
+具有字符串值\“+s+”\”,
stringValues.add(s));
}
}

要执行开发时的要求,需要解析代码,本质上是重复编译。因此,让它被编译并创建一个单元测试来执行您的检查是有意义的,然后设置项目以便在每次编译代码库时运行单元测试。我很确定目前最常用的单元测试库是

要轻松检查值的唯一性,可以使用以下方法,如果要添加的项已存在于集合中,则该方法将返回false:

@Test
public class TestConstantUniqueness() {
    Set<String> stringValues = new HashSet<String>();
    for (MyConstantEnum value : MyConstantEnum.values()) {
        String s = value.stringValue();
        Assert.assertTrue(
            "More than one constant in " + MyConstantEnum.class
                + " has the string value \"" + s + "\"",
            stringValues.add(s));
    }
}
@测试
公共类TestConstantUniqueness(){
Set stringValues=newhashset();
对于(myConstantum值:myConstantum.values()){
字符串s=value.stringValue();
Assert.assertTrue(
“+myconstantum.class中的多个常量”
+具有字符串值\“+s+”\”,
stringValues.add(s));
}
}

为什么不使用枚举?这将消除字符串作为人工常量的使用。这就是创建枚举的目的。枚举应该是使用它们的包的一部分,每个部分的枚举都有自己的名称空间。Ctrl+F也可以帮助您吗?当然,Enum是一个不错的选择。Enum会更简单,另一个选择是只读字典,但你需要更多的理由,还有一两个单元测试。@HovercraftFullOfEels但Enum也接受插入两个具有相同值的常量,例如Constant3(“value3”)、Constant4(“value3”)@ZiyaoWei我们需要it系统不是由开发人员维护为什么不使用枚举?这将消除字符串作为人工常量的使用。这就是创建枚举的目的。枚举应该是使用它们的包的一部分,每个部分的枚举都有自己的名称空间。Ctrl+F也可以帮助您吗?当然,Enum是一个不错的选择。Enum会更简单,另一个选择是只读字典,但你需要更多的理由,还有一两个单元测试。@HovercraftFullOfEels但Enum也接受插入两个具有相同值的常量,例如Constant3(“value3”)、Constant4(“value3”)@ZiyaoWei我们需要it系统不是由开发人员维护的,但也可以枚举接受插入2个具有相同值的常量,例如
Constant3(“value3”)、Constant4(“value3”)但也枚举接受插入2个具有相同值的常量,例如
Constant3(“value3”)、Constant4(“value3”)