基本上我要做的是创建一个可以采用许多不同类型枚举的通用方法。我正在寻找一种方法来做我将要描述的方式,或者一个人可能想到的任何其他方式。
我有一个基类,还有很多其他的类。在每个类中,我想要一个名为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。
答案 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()
方法。