为枚举字符串值定义常量“值”

Vin*_*uri 5 java enums sonarqube

对于如下定义的枚举

public enum Cars {

    SWIFT("Maruti"),
    DZIRE("Maruti"), 
    CIAZ("Maruti"), 
    I10("Hyundai"), 
    CRETA("Hyundai");

    String company;
    Cars(String company){
        this.company = company;
    }   
}
Run Code Online (Sandbox Code Playgroud)

声纳错误

Define a constant instead of duplicating this literal "Maruti" 3 times.

如果我们定义静态字符串,它将无法编译

Cannot reference a field before it is defined

解决方案1:

public enum Cars {

    SWIFT(CarsString.MARUTI.companyName),DZIRE("Maruti"), I10("Hyundai"), CRETA("Hyundai");

    static String MARUTI = "Maruti";
    String company;
    Cars(String company){
        this.company = company;
    }

    enum CarsString {
        MARUTI("maruti"),
        HYUNDAI("Hyundai");
        String companyName;
        CarsString(String companyName){
            this.companyName = companyName;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:

不知道这是否是我们这样做的方式。当Cars.MARUTI未引用它时,它会出错Cannot reference a field before it is defined

public enum Cars {

    SWIFT(Cars.MARUTI),DZIRE(Cars.MARUTI), I10("Hyundai"), CRETA("Hyundai");

    public static final String MARUTI = "Maruti";
    String company;
    Cars(String company){
        this.company = company;
    }
 }
Run Code Online (Sandbox Code Playgroud)

我有10个处于类似状态的枚举,而上述解决方案1并没有给我多少鼓励。解决方案2解决了目的,

但是,为什么我们要引用Cars.MARUTI而不是 MARUTI直接引用呢?这是一个限制吗?

我们如何在枚举中引用一个常量值?

Mar*_*fer 5

如何在自己的Enum中定义公司?例如:

public enum Car {
    SWIFT(Company.MARUTI),
    DZIRE(Company.MARUTI),
    CIAZ(Company.MARUTI),
    I10(Company.HYUNDAI),
    CRETA(Company.HYUNDAI);

    Company company;

    Cars(Company company) {
        this.company = company;
    }
}

public enum Company {
    HYUNDAI("Hyundai"),
    MARUTI("Maruti");

    String name;

    Company(String name) {
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:根据@Basil Bourque的评论,改进了命名约定!