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以避免诱惑。:)