首页 > 解决方案 > 我可以在构造函数中使用枚举常量的名称吗?

问题描述

假设我有一个Thing带有名称的 s 枚举:

public enum Thing {
    
    THINGA, THINGB, THINGC, THINGD,
    
    THINGE("Thing E"),
    
    ;
    
    public final String name;
    
    private Thing(String pname) {
        
        name = pname;
        //...
        
    }
    
    private Thing() {
        
        // See question
        
    }
    
}

THINGE假设我想对所有其他s做同样的事情Thing,除了我希望默认名称与枚举常量本身的名称相同,例如:

private Thing() {
    
    this(/* the name of the constant itself */);
    
}

pname本质上,我希望for的隐含值为"THINGA"for THINGA"THINGB"for THINGB"THINGC"for THINGC"THINGD"forTHINGD等。使用其中一个toString()or name(),编译器会大喊:

error: cannot reference this before supertype constructor has been called

有没有办法避免这种情况?

具体来说,为了用户,我包括名称。看起来"Thing E"比看起来更自然"THINGE",但如果我可以编写一个方法来"THINGA"转换"Thing A"并在构造函数中使用它,那么我编程起来会容易得多。

标签: javaenums

解决方案


您不需要为此向构造函数提供参数,使用name()和一些String操作应该可以让您到达那里。

public static void main(String[] args) {
    for (Thing value : Thing.values()) {
        System.out.println("value.name = " + value.name);
    }
}

public enum Thing {
    THINGA,
    THINGB,
    THINGC,
    THINGD,
    THINGE;

    public final String name;

    Thing() {
        this.name = name().replace("THING", "Thing ");
    }
}

印刷

value.name = Thing A
value.name = Thing B
value.name = Thing C
value.name = Thing D
value.name = Thing E

推荐阅读