通过常用方法访问Java中的不同枚举

时间:2015-08-10 22:39:18

标签: 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;
}

有没有办法能够传递所有不同类型的枚举,还是有更好的方法来做到这一点?

--- --- EDIT

我已经为我的枚举添加了一个界面,但是我如何能够对我的方法进行生成?我有这个:

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。

1 个答案:

答案 0 :(得分:4)

枚举可以实现界面,因此您可以使用您希望能够调用的这些方法创建界面:

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

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

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;
  }
}

如果你想得到真正的花哨,可以将界面的子类型限制为枚举,但泛型类型声明将非常丑陋(因此难以理解和维护)并且可能赢得了提供任何真实的&#34;好处。

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