本质上,我想做的是创建一个通用方法,它可以采用多种不同类型的枚举。我正在寻找一种方法来实现我将要描述的方式,或者人们可能想到的任何其他方式。
我有一个基类,许多其他类都继承自该基类。在每个类中,我都希望有一个名为 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/