Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中通过公共方法访问的不同枚举_Java_Android_Generics_Enums - Fatal编程技术网

Java中通过公共方法访问的不同枚举

Java中通过公共方法访问的不同枚举,java,android,generics,enums,Java,Android,Generics,Enums,本质上,我正在尝试创建一个通用方法,它可以接受许多不同类型的枚举。我正在寻找一种方法,来描述我将要描述的方式,或者一个人可能想到的任何其他方式 我有一个基类,还有许多其他的类扩展了它。在这些类中,我希望有一个名为Includes的枚举,如下所示: public enum Includes { VENDOR ("Vendor"), OFFERS_CODES ("OffersCodes"), REMAINING_REDEMPTIONS ("RemainingRedemptio

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

我有一个基类,还有许多其他的类扩展了它。在这些类中,我希望有一个名为
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;
    }
}
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;
}
我有一个方法,它接受一个从基类扩展而来的泛型类,我希望能够将该类上的任何包含传递给该方法,并能够访问枚举上的方法,如下所示:

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;
    }
}
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;
}
ApiHelper.Response offer=ApiHelper.post(新offer(),offer.Includes.VENDOR);
公共响应站(T输入对象,包括…包括){
ArrayList urlParams=新的ArrayList();
对于(包括:包括){
添加(include.getUrlParam());
}
返回null;
}
是否有一种方法可以传递所有不同类型的枚举,或者有更好的方法来实现这一点

---编辑---

我已经在我的枚举中添加了一个接口,但是我怎样才能泛化我的方法呢?我有这个:

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;
}
public Response post(提供inputObject、BaseClass.Includes){
对于(枚举包括:包括){
如果(包括报价实例。包括){
((Offer.Includes)include.getUrlParam();
}
}
返回null;
}

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

枚举可以实现接口,因此您可以使用希望能够调用的以下方法创建接口:

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;
  }
}
如果您真的想做得更好,可以将接口的子类型限制为枚举,但是泛型类型声明将非常难看(因此很难理解和维护),并且可能不会提供任何“真正”的好处



与此设计无关的注意事项:enum实例是可变的,这是一种非常强烈的代码味道。重新考虑一下为什么首先需要该
setUrlParam()
方法。

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

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;
  }
}
如果您真的想做得更好,可以将接口的子类型限制为枚举,但是泛型类型声明将非常难看(因此很难理解和维护),并且可能不会提供任何“真正”的好处



与此设计无关的注意事项:enum实例是可变的,这是一种非常强烈的代码味道。重新考虑一下为什么您首先需要使用
setUrlParam()
方法。

仅不相关的注释就值得在setUrlParam()上加1分。大多数情况下,这只是POJOs的习惯。后期编辑。@idratherbeintheair您应该将
urlParam
设置为final以避免诱惑。:)仅不相关的注释就应该在setUrlParam()上获得+1.5分。大多数情况下,这只是POJOs的习惯。后期编辑。@idratherbeintheair您应该将
urlParam
设置为final以避免诱惑。:)