覆盖 Java 中的枚举
Overriding an enum in Java
我在 Java 中有一个 class,它有一个 enum 实现 界面如
class MyClass{
interface Command{
void execute();
String getId();
}
enum MyCommands implements Command{
aCmd{
void execute(){/*do something*/}
String getId(){return "aCmd";}
}
}
void MyMethod(String s){
for(Command cmd: MyCommands){
if(s.equals(cmd.getId())) cmd.execute();
}
}
}
class 有一个解析文本的方法,我在其中迭代 enum 值并将输入与 getId() 进行比较 每个命令。
现在我确实想用不同的命令扩展 class(也就是说,我想以覆盖 MyCommands 并定义新命令的方式扩展它)。我怎样才能做到这一点?
(我愿意以其他简单的方式重构超级 class)
class childClass extends myClass{
//In myMethod this enum should be iterated instead of myCommands
enum childCommands implements Command{
otherCmd{
void execute(){/*do something*/}
String getId(){return "aCmd";}
}
}
这应该有效。添加 public
关键字和 @Override
它们。
interface Command{
void execute();
String getId();
}
enum MyCommands implements Command{
aCmd{
@Override
public void execute() {
/*do something*/
}
@Override
public String getId() {
return "aCmd";
}
}
}
而且你有一些错误,例如:
String
开头有小s
- 在
return "aCmd"
中缺少 ;
如果您想扩展您的 class,最好创建一个额外的 enum
,例如MyExtendedCommands
。然后你可以在 class 中创建一个 Set<Command>
,它包含 EnumSet
和 MyCommands
和 MyExtendedCommands
的扩展 EnumSet
。
class MyClass {
interface Command {
void execute();
String getId();
}
enum MyCommands implements Command {
aCmd {
public void execute() {/* do something */
}
public String getId() {
return "aCmd";
}
}
}
public void myMethod(String s) {
for (Command cmd : EnumSet.allOf(MyCommands.class)) {
if (s.equals(cmd.getId()))
cmd.execute();
}
}
}
可以使用以下方式进行扩展:
class MyExtendedClass extends MyClass {
enum MyExtendedCommands implements Command {
bCmd {
public void execute() {/* do something */
}
public String getId() {
return name();
}
}
}
public void myMethod(String s){
Set<Command> allCommands = new HashSet<>();
allCommands.addAll(EnumSet.allOf(MyCommands.class));
allCommands.addAll(EnumSet.allOf(MyExtendedCommands.class));
for(Command cmd: allCommands){
if(s.equals(cmd.getId())) cmd.execute();
}
}
}
显然这并不能保护您在编译时避免重复。但是在运行时防止重复应该很容易(例如,通过测试 allCommands
.
中结果命令的数量
话又说回来,这也是一种覆盖命令的简单方法,所以也许这个缺点可以变成一个优点。
我在 Java 中有一个 class,它有一个 enum 实现 界面如
class MyClass{
interface Command{
void execute();
String getId();
}
enum MyCommands implements Command{
aCmd{
void execute(){/*do something*/}
String getId(){return "aCmd";}
}
}
void MyMethod(String s){
for(Command cmd: MyCommands){
if(s.equals(cmd.getId())) cmd.execute();
}
}
}
class 有一个解析文本的方法,我在其中迭代 enum 值并将输入与 getId() 进行比较 每个命令。
现在我确实想用不同的命令扩展 class(也就是说,我想以覆盖 MyCommands 并定义新命令的方式扩展它)。我怎样才能做到这一点? (我愿意以其他简单的方式重构超级 class)
class childClass extends myClass{
//In myMethod this enum should be iterated instead of myCommands
enum childCommands implements Command{
otherCmd{
void execute(){/*do something*/}
String getId(){return "aCmd";}
}
}
这应该有效。添加 public
关键字和 @Override
它们。
interface Command{
void execute();
String getId();
}
enum MyCommands implements Command{
aCmd{
@Override
public void execute() {
/*do something*/
}
@Override
public String getId() {
return "aCmd";
}
}
}
而且你有一些错误,例如:
String
开头有小s
- 在
return "aCmd"
中缺少
;
如果您想扩展您的 class,最好创建一个额外的 enum
,例如MyExtendedCommands
。然后你可以在 class 中创建一个 Set<Command>
,它包含 EnumSet
和 MyCommands
和 MyExtendedCommands
的扩展 EnumSet
。
class MyClass {
interface Command {
void execute();
String getId();
}
enum MyCommands implements Command {
aCmd {
public void execute() {/* do something */
}
public String getId() {
return "aCmd";
}
}
}
public void myMethod(String s) {
for (Command cmd : EnumSet.allOf(MyCommands.class)) {
if (s.equals(cmd.getId()))
cmd.execute();
}
}
}
可以使用以下方式进行扩展:
class MyExtendedClass extends MyClass {
enum MyExtendedCommands implements Command {
bCmd {
public void execute() {/* do something */
}
public String getId() {
return name();
}
}
}
public void myMethod(String s){
Set<Command> allCommands = new HashSet<>();
allCommands.addAll(EnumSet.allOf(MyCommands.class));
allCommands.addAll(EnumSet.allOf(MyExtendedCommands.class));
for(Command cmd: allCommands){
if(s.equals(cmd.getId())) cmd.execute();
}
}
}
显然这并不能保护您在编译时避免重复。但是在运行时防止重复应该很容易(例如,通过测试 allCommands
.
话又说回来,这也是一种覆盖命令的简单方法,所以也许这个缺点可以变成一个优点。