我基本上想要一个具有特定方法的enum
,例如
public interface PropertyTypeMethods {
public int getTypeId();
public void setTypeId(Integer typeId);
}
等等
public enum BasePropertyTypes implements PropertyTypeMethods {
ONE, TWO;
private int typeId;
@Override
public int getTypeId() {
return typeId;
}
@Override
public void setTypeId(Integer typeId) {
this.typeId = typeId;
}
}
以及此枚举的扩展版本,例如
public enum ExtendedPropertyTypes implements PropertyTypeMethods {
HUNDRED, THOUSEND;
// same as above
}
会导致ONE.setTypeId(1)
==> ONE.getTypeId()==1 //true
。这是基本概念。但现在我想调用一种通用的方法,例如。
private <E extends Enum<E> & PropertyTypeMethods> void initEnum(Enum<E> curType) {
// the below approach does not work :-/
curType.setTypeId(1); // or any other reasonable value....
但不知怎的,我无法弄清楚正确的方法签名是什么。在此之后question我至少想到了一些难题 -
但仍然没有得到它的方法签名。仍然不清楚如何在签名中正确指定curType
以执行适当的调用。
答案 0 :(得分:1)
正确的签名只是
private void initEnum(PropertyTypeMethods onject) {
object.setTypeId(1);
}
但正如Andy Turner所提到的,枚举预计将是不可改变的,即只有最终不可变的领域。因此,枚举也有一个构造函数Enum Types。
如果你有更复杂的枚举,那么按照以下方式实现它们是常用的方法
public enum BasePropertyTypes implements PropertyTypeMethods {
ONE (new PropertyTypeMethods() {
@Override
public int getTypeId() {
return 1;
}
});
private final PropertyTypeMethods m;
BasePropertyTypes(PropertyTypeMethods m) {
this.m = m;
}
@Override
public int getTypeId()
{
return this.m.getTypeId();
}
}
但是从你的例子中,我建议你回顾一下你的实际问题。根本不适合使用枚举。
答案 1 :(得分:1)
这将有效:
private <E extends Enum<E> & PropertyTypeMethods> void initEnum(E curType) {
curType.setTypeId(1);
}
然而,我并不认为制作可变Enum
s是一个好主意(它们意味着是恒定值的标签,而不是带状态的单身人士)。此外,你不应该&#39;编写需要Enum
参数的方法时,他们应该关心的是它的接口:
// This will be easier to work with down the road
private void initEnum(PropertyTypeMethods curType) {
curType.setTypeId(1);
}