【问题标题】:Choosing which Enum to use dynamically in Java选择在 Java 中动态使用的 Enum
【发布时间】:2021-06-29 16:59:09
【问题描述】:

我需要根据一个参数动态选择一个具有一些属性的枚举,该参数将提供要使用的枚举名称的后缀。 我试过了,但是“getCodigoAsString()”方法不起作用。

枚举示例:

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor @Getter
public enum Chaves_35 {
    MODELO_DISPOSITIVO(1234,"TEXT","IN","Modelo Dispositivo"),
    DISPOSITIVO_SUPORTA_MULTI_TAREFA(4423,"TEXT","IN","Dispositivo Suporta Multi Tarefa"),
    NOME_DISPOSITIVO(7845,"TEXT","IN","Nome Dispositivo"),
    IDIOMA_DISPOSITIVO(3288,"TEXT","IN","Idioma Dispositivo"),
    ;

    private int codigo;
    private String tipo;
    private String fluxo;
    private String descricao;
  
    public String getCodigoAsString() {
        return String.valueOf(codigo);
    }
    
}

做出选择的类:

 public class ChavesCanal { 

    public static Enum<?>[] BuscaChavesCanal(int idCanal) {
        Enum<?>[] resp = null;

        switch (idCanal) {
            case 6:
                resp = Chaves_6.values();
                break;
            case 8:
                resp = Chaves_8.values();
                break;
            case 10:
                resp = Chaves_10.values();
                break;
            case 17:
                resp = Chaves_17.values();
                break;
            case 21:
                resp = Chaves_21.values();
                break;
            case 22:
                resp = Chaves_22.values();
                break;
            case 27:
                resp = Chaves_27.values();
                break;
            case 28:
                resp = Chaves_28.values();
                break;
            case 35:
                resp = Chaves_35.values();
                break;
            case 37:
                resp = Chaves_37.values();
                break;
            default:
                break;
        }

        return resp;
    }
}

这是我尝试使用“ChavesCanal()”类的方法:

public static boolean VerificaChavesCanais_JSON(int codigoCanal) {
        if(codigoCanal <= 0) return false;

        JSONObject payloadJSON = new JSONObject("{\"1\":\"35\",\"8\":\"2021-06-29 14:33:41.121\",\"35\":\"Windows 10\",\"1234\":\"Computer\",\"3288\":\"PT-BR\",\"4423\":\"SIM\",\"7732\":\"64x\",\"7845\":\"PC_MAPS_01\"}");
        
        try {
            for (Enum<?> chaveId : ChavesCanal.BuscaChavesCanal(codigoCanal)) {
                if(!payloadJSON.has(chaveId.getCodigoAsString())) {
                    System.out.println("  .... chave '" + chaveId.getCodigoAsString() + "' não encontrada!!!");
                }
            }

            return true;

        } catch (Exception e) {
            System.out.println("ERRO em VerificaChavesCanais_JSON(): " + e.getMessage());
            return false;
        }
    }

谢谢大家!!!

【问题讨论】:

  • 什么不起作用? payloadJSON 的内容是什么?
  • 嗨@EmersonPardo。 “chaveId.getCodigoAsString()”不起作用(在最后一段代码中)。出现错误:未定义类型 Enum 的方法 getCodigoAsString()。此方法位于枚举 Chaves_35 内。谢谢。

标签: java reflection enums


【解决方案1】:

我不认为你的代码是这样工作的。当您定义Enum&lt;?&gt; 时,编译器无法知道您想要的enum 提供了getCodigoAsString 方法,因此您会收到编译错误。

至少从您展示的代码来看,枚举似乎不是满足您需求的正确数据结构。你完全使用枚举值吗?您应该考虑将这种类型的信息放在更合适的数据结构中,例如 Map。所以你摆脱了整个switch 的东西。

旁注:ChavesCanal.BuscaChavesCanal 违反了 java 命名约定。应该命名为ChavesCanal.buscaChavesCanal

【讨论】:

    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多