java - 通过通用方法访问 Java 中的各种枚举

标签 java android generics enums

本质上,我想做的是创建一个通用方法,它可以采用多种不同类型的枚举。我正在寻找一种方法来实现我将要描述的方式,或者人们可能想到的任何其他方式。

我有一个基类,许多其他类都继承自该基类。在每个类中,我都希望有一个名为 Includes 的枚举,如下所示:

public enum Includes {
    VENDOR ("Vendor"),
    OFFERS_CODES ("OffersCodes"),
    REMAINING_REDEMPTIONS ("RemainingRedemptions");

    private String urlParam;

    Includes(String urlParam) {
        this.urlParam = urlParam;
    }

    public String getUrlParam() {
        return urlParam;
    }
}

我有一个方法接受一个从 BaseClass 扩展的泛型类,我还希望能够将该类中的任何包含传递给该方法,并能够访问枚举中的方法,像这样:

ApiHelper.Response<Offer> offer = apiHelper.post(new Offer(), Offer.Includes.VENDOR);

public <T extends BaseClass> Response<T> post(T inputObject, Includes... includes) {

    ArrayList<String> urlParams = new ArrayList<String>();

    for (Include include : includes){
        urlParams.add(include.getUrlParam());
    }

    return null;
}

有没有一种方法可以传递所有不同类型的枚举,或者有更好的方法吗?

---编辑---

我已经为我的枚举添加了一个接口(interface),但是我该如何泛化我的方法呢?我有这个:

public <T extends BaseClass> Response<T> post(Offer inputObject, BaseClass.Includes includes) {

    for (Enum include : includes){
        if (include instanceof Offer.Includes){
            ((Offer.Includes) include).getUrlParam();
        }
    }

    return null;
}

但是我在 apiHelper.post(new Offer(), Offer.Includes.VENDOR); 上得到一个错误,说第二个参数必须是 BaseClass.Includes。

最佳答案

枚举可以实现接口(interface),因此您可以使用这些您希望能够调用的方法创建一个接口(interface):

interface SomeBaseClass {
  String getUrlParam();
  void setUrlParam(String urlParam);
}

然后你的枚举可以实现这个接口(interface):

public enum Includes implements SomeBaseClass {
  VENDOR ("Vendor"),
  OFFERS_CODES ("OffersCodes"),
  REMAINING_REDEMPTIONS ("RemainingRedemptions");

  private String urlParam;

  Includes(String urlParam) {
    this.urlParam = urlParam;
  }

  @Override
  public String getUrlParam() {
    return urlParam;
  }

  @Override
  public void setUrlParam(String urlParam) {
    this.urlParam = urlParam;
  }
}

如果你真的想变得很花哨,可以将接口(interface)的子类型限制为枚举,但泛型类型声明将非常丑陋(因此难以理解和维护)并且可能不会提供任何“真正的”好处.


关于此设计的无关注释:枚举实例是可变的,这是一种非常强烈的代码味道。重新考虑为什么首先需要 setUrlParam() 方法。

关于java - 通过通用方法访问 Java 中的各种枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31930330/

相关文章:

java - 从 @RunWith 过渡到 @ExtendWith

java - 如何在 Java 中比较字符串?

android - 本地对等点的 WebRTC VideoView View 不正确

android - Jetpack Compose,如何在 Scaffold 中的 .showSnackbar() 中更改 snackbar Action 的颜色?

Java 泛型和数字

java - Servlet 中的 ConcurrentHashMap

java - Java中的实例字段声明

android - Android 上通过 SSL 上传的 HttpsURLConnection 卡住(具有不同的故障模式)

c# - 在 Ninject 3.0 中绑定(bind)泛型类型

java - 如何将 getConstructor 与泛型类一起使用?