好的,在堆栈上的这个答案中,答案的海报显示了一个如何在枚举中使用抽象方法的示例。我将在这里为后代重复该答案,尽管稍作修改以更好地说明我的问题的基础。
考虑这个使用抽象方法的枚举:
public enum Vehicle {
CAR {
public String action() { return "DRIVE!"; }
},
TRUCK {
public String action() { return "DRIVE!"; }
},
BUS {
public String action() { return "DRIVE!"; }
},
TRACTOR {
public String action() { return "DRIVE!"; }
},
MOTORCYCLE {
public String action() { return "RIDE!"; }
},
BOAT {
public String action() { return "SAIL!"; }
},
AIRPLANE {
public String action() { return "PILOT!"; }
};
public abstract String action();
}
如您所见,由于“动作”是一个抽象函数,因此每个元素都必须通过枚举的匿名子类定义覆盖。
将此与这个无抽象、功能相同的版本进行对比,它甚至使用完全相同的 API:
enum Vehicle {
CAR,
TRUCK,
BUS,
TRACTOR,
MOTORCYCLE,
BOAT,
AIRPLANE;
public String action(){
switch(this)
{
case MOTORCYCLE : return "RIDE!";
case BOAT : return "SAIL!";
case AIRPLANE : return "FLY!";
default : return "DRIVE!";
}
}
}
在此示例中,您只需指定与默认值不同的特定情况。此外,它将值保存在一个漂亮、清晰易读的列表中,并减少了大量无关代码。
也许我遗漏了一些东西,但是抽象方法方法是否有技术优势?非抽象版本没有给你什么?它有什么额外的能力吗?
注意:我怀疑实际的答案是因为它本身并不是枚举的函数,而是因为枚举被编译为一个类并且一个类支持抽象函数。
但是,我也不确定这是否正确,因为正如其他人所展示的那样,枚举编译为 a
static final class
这意味着它不能被子类化。也许编译器在使用抽象函数时没有添加“final”。不确定,因为我无法查看生成的输出,所以我不能肯定,但这是有道理的。但特别是对于这个问题,具有抽象函数的枚举可以做任何非抽象版本不能做的事情吗?