在Java中是否可以同时返回枚举名和值?

在Java中是否可以同时返回枚举名和值?,java,json,spring-mvc,enums,jackson,Java,Json,Spring Mvc,Enums,Jackson,是否可以将枚举名称和标签放在一起? 比如: 我使用的是SpringMVC,但我认为这与此无关 我试图重写toString()方法,但不幸的是,它不起作用 我的代码: 公共枚举类别a{ COMBUSTIVEL(“COMBUSTIVEL”), TROCADEOLEO(“Troca deóleo”), PNEUDIANTEIRO(“Pneu dianteiro”), PNEUTRASEIRO(“Pneu traseiro”), CORRENTE(“CORRENTE”), RELACAO(“Relaçã

是否可以将枚举名称和标签放在一起? 比如:

我使用的是SpringMVC,但我认为这与此无关

我试图重写
toString()
方法,但不幸的是,它不起作用

我的代码:

公共枚举类别a{
COMBUSTIVEL(“COMBUSTIVEL”),
TROCADEOLEO(“Troca deóleo”),
PNEUDIANTEIRO(“Pneu dianteiro”),
PNEUTRASEIRO(“Pneu traseiro”),
CORRENTE(“CORRENTE”),
RELACAO(“Relação”);
私有字符串标签;
类别A(字符串项){
this.label=项目;
}
公共字符串getLabel(){
返回此.label;
}
@凌驾
公共字符串toString(){
返回此.label;
}
公共字符串[][]getList(){
Categoria[]值=Categoria.values();
返回?;
}
}
结果是:

[
    "COMBUSTIVEL",
    "TROCADEOLEO",
    "PNEUDIANTEIRO",
    "PNEUTRASEIRO",
    "CORRENTE",
    "RELACAO"
]

可以这样做:

        public static String[][] getList(){
            Categoria[] values = Categoria.values();

            String[][] result = new String[values.length][2]; 

            for (int i = 0; i < values.length; ++i) {
                String[] pair = {values[i].name(), values[i].toString()};
                result[i] = pair;
            }

            return result;
        }
公共静态字符串[][]getList(){
Categoria[]值=Categoria.values();
字符串[][]结果=新字符串[values.length][2];
对于(int i=0;i
首先将toString方法更改为

@Override
public String toString() {
    return name() + ", " + getLabel();
}
然后更改您的getList()

public字符串[][]getList(){
Categoria[]值=Categoria.values();
List resultList=new ArrayList();
对于(类别值:值){
结果列表.add(value.toString);
}
返回resultList.toArray();
}

您有多种选择如何实现这一目标。您只需返回名称为键、标签为值的映射:

public static Map<String, String> getList() {
    return Arrays.stream(Categoria.values())
            .collect(Collectors.toMap(Categoria::name, Categoria::getLabel));
}

另一个选项是将枚举映射到自定义对象或创建自定义序列化程序。

尝试更简单的方法:

public enum Categoria {
    COMBUSTIVEL("Combustível"), TROCADEOLEO("Troca de óleo"), PNEUDIANTEIRO("Pneu dianteiro"),
    PNEUTRASEIRO("Pneu traseiro"), CORRENTE("Corrente"), RELACAO("Relação");

    private String label;

    Categoria(String item) {
        this.label = item;
    }

    public String getLabel() {
        return this.label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public static String myText() {
        StringBuffer str = new StringBuffer("");
        int i = 0;
        Categoria[] categoria = Categoria.values();
        str.append("[\n");
        for(Categoria c : categoria) {
            str.append("\t{\""+c.getLabel()+"\", \""+categoria[i].name()+"\"}");
            if((i + 1) < categoria.length) {
                str.append(",\n");
            }
            i++;
        }
        str.append("\n]");

        return str.toString();        
    }
}

public class Test {

    public static void main(String[] args) {
        System.out.println(Categoria.myText());
    }
}

已尝试获取数组,但未成功:公共字符串[][]getList(){Categoria[]values=Categoria.values();返回?;}不要覆盖枚举上的
toString
;这会给其他人带来很多困惑。改用
getLabel
(通常可以将枚举
中的所有字段设置为final
)。这两种方法都必须是静态的,否则无法以有用的方式调用它们。为什么要使用2D数组?您的解决方案在存储方面可以正常工作,但在检索值方面却没有那么好。地图会更有效。它还允许不受限制地多次存储相同的枚举,除非您添加大量代码来阻止它。问题是询问
2D
数组:
getList
的返回类型是
String[][]
。最好询问OP。我猜这里的API是由需要数组的某个客户端使用的。
public static Map<String, String> getList() {
    return Arrays.stream(Categoria.values())
            .collect(Collectors.toMap(Categoria::name, Categoria::getLabel));
}
public static String[][] getList() {
    return Arrays.stream(Categoria.values())
            .map(c -> new String[] {c.name(), c.getLabel()})
            .toArray(String[][]::new);
}
public enum Categoria {
    COMBUSTIVEL("Combustível"), TROCADEOLEO("Troca de óleo"), PNEUDIANTEIRO("Pneu dianteiro"),
    PNEUTRASEIRO("Pneu traseiro"), CORRENTE("Corrente"), RELACAO("Relação");

    private String label;

    Categoria(String item) {
        this.label = item;
    }

    public String getLabel() {
        return this.label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public static String myText() {
        StringBuffer str = new StringBuffer("");
        int i = 0;
        Categoria[] categoria = Categoria.values();
        str.append("[\n");
        for(Categoria c : categoria) {
            str.append("\t{\""+c.getLabel()+"\", \""+categoria[i].name()+"\"}");
            if((i + 1) < categoria.length) {
                str.append(",\n");
            }
            i++;
        }
        str.append("\n]");

        return str.toString();        
    }
}

public class Test {

    public static void main(String[] args) {
        System.out.println(Categoria.myText());
    }
}
[
    {"Combustível", "COMBUSTIVEL"},
    {"Troca de óleo", "TROCADEOLEO"},
    {"Pneu dianteiro", "PNEUDIANTEIRO"},
    {"Pneu traseiro", "PNEUTRASEIRO"},
    {"Corrente", "CORRENTE"},
    {"Relação", "RELACAO"}
]