Java 继承枚举重新定义

Java 继承枚举重新定义,java,enums,Java,Enums,这比听起来要复杂得多,但我想我不得不尝试类似的东西。我想用一个枚举的原型来创建一个抽象父类(我想用一个值来声明枚举,这个值可能是默认的单位化值,同时声明我将从子类中使用的两个方法),然后我想创建一个类来扩展抽象父类,以实际初始化同一个枚举(我知道这实际上隐藏了父枚举)这样子类将在枚举中定义一组项,但可能保留方法 我对这一抽象层次了解不多,因此我现在将描述我的问题的性质,以防有更实际的解决方案: 我有一堆文件,其中包含实现许多基于枚举的命令的类。(例如,class1 implements Obse

这比听起来要复杂得多,但我想我不得不尝试类似的东西。我想用一个枚举的原型来创建一个抽象父类(我想用一个值来声明枚举,这个值可能是默认的单位化值,同时声明我将从子类中使用的两个方法),然后我想创建一个类来扩展抽象父类,以实际初始化同一个枚举(我知道这实际上隐藏了父枚举)这样子类将在枚举中定义一组项,但可能保留方法

我对这一抽象层次了解不多,因此我现在将描述我的问题的性质,以防有更实际的解决方案: 我有一堆文件,其中包含实现许多基于枚举的命令的类。(例如,class1 implements Observer有一个更新方法,使用基于枚举的开关来决定选择了什么命令,这同样适用于其他类)现在,我想以一种方式来抽象整个事件,即在所有类中都有一个名称完全相同的enum变量(例如CommandSet)这样我就可以在父类中有一个泛型方法,可以使用枚举的内部方法将帮助列表打印到我的系统中。现在我知道我可以在每个类中重写完全相同的方法,但我想对其进行抽象,以便其他人可以继续扩展我正在创建的库

希望我不会太困惑或太困惑,有人可以帮助我!:)

编辑:下面是代码的想法(可能不正确):


不可能:Java枚举既不能扩展另一个类,也不能扩展自己

但是,它们可以实现接口。也许你可以利用这个优势


枚举还有一些其他方面可以帮助您:枚举不是。您可以更改枚举的字段值,但是这会更改整个JVM的字段值


另一种方法可能是将您的子类实例传递到枚举的一个方法中,并让枚举将您的子类用作为枚举的不同用户从枚举中获取不同的功能。

不可能:Java枚举既不能扩展另一个类,也不能扩展自己

但是,它们可以实现接口。也许你可以利用这个优势


枚举还有一些其他方面可以帮助您:枚举不是。您可以更改枚举的字段值,但是这会更改整个JVM的字段值


另一种方法可能是将您的子类实例传递到枚举的一个方法中,并让枚举将您的子类用作为枚举的不同用户从枚举中获取不同的功能。

不,您不能这样做

Java枚举很快就用完了&当然,当您以后想要添加/扩展更多定义或实例化枚举实例时。(例如,从数据库加载它们,在实例方法中配置它们,而不仅仅是静态配置。)

Java枚举中的行为/或逻辑也有一定的局限性——您可以定义和设置属性,但只能静态初始化,并且逻辑似乎是基本的(您最终只需将引用或序号与其他定义的枚举常量进行比较)

你能做什么:

您可以使用整数代码实现祖先命令或AbstractCommand类,然后将其子类化以定义具体值/附加代码/加载或配置实例等

为了获得更多的好处,您可以获得高效的切换和调度(通过代码)以及定义更多细节/属性、根据需要实例化命令等功能

本质上,这就是在Java支持枚举之前定义枚举的方式。尽管您可能将它们用作值对象,而不是严格的静态对象

我的专业知识:

我做了大量的编译器和类型系统工作,尝试了文件类型和相关数据/行为的枚举。。探索外部界限,并达到明确的界限

我还喜欢能够实例化并返回一个新的UnknownFileType(“”)作为答案。枚举不能这样做

示例:

(我们将按字符串而不是int发送,因为您的代码似乎使用Java 7。这使得命令解析比同时要求语法“name”和内部整数“code”更容易。)


不,你不能那样做

Java枚举很快就用完了&当然,当您以后想要添加/扩展更多定义或实例化枚举实例时。(例如,从数据库加载它们,在实例方法中配置它们,而不仅仅是静态配置。)

Java枚举中的行为/或逻辑也有一定的局限性——您可以定义和设置属性,但只能静态初始化,并且逻辑似乎是基本的(您最终只需将引用或序号与其他定义的枚举常量进行比较)

你能做什么:

您可以使用整数代码实现祖先命令或AbstractCommand类,然后将其子类化以定义具体值/附加代码/加载或配置实例等

为了获得更多的好处,您可以获得高效的切换和调度(通过代码)以及定义更多细节/属性、根据需要实例化命令等功能

本质上,这就是在Java支持枚举之前定义枚举的方式。尽管您可能将它们用作值对象,而不是严格的静态对象

我的专业知识:

我做了大量的编译器和类型系统工作,尝试了文件类型和相关数据/行为的枚举。。探索外部界限,并达到明确的界限

我还喜欢能够实例化并返回一个新的UnknownFileType(“”)作为答案。枚举不能这样做

示例:

(我们将按字符串而不是int发送,因为您的代码似乎使用Java 7
  public abstract class Commands{
    enum CommandSet{ 
        // empty command, placeholder
        null_command ("command name", "command description");
        // the Strings used for name and description
        private final String name;
        private final String description;
        // constructor 
        CommandSet(String name, String description){
            this.name=name;
            this.description=description;
        }
        // get parameters
        public String getName(){
            return name;
        }
        public String getDescription(){
            return description;
        }
    }
    public void showHelp(){
        for (CommandSet i : CommandSet.values()) {
            printf(i.getName(),":",i.getDescription());
        }
    }
}

public class StandardCommads extends Commands implements Observer{
    // I want to change the enum here, just changing the values so that null_command ("command name", "command description") will get removed and I will add a dozen other values, but keep the methods that the parent had
    // update inherited from Observer
    @Override
    public void update(Observable observable, Object object) {
        // I want the commands inside the switch cases defined inside this class's enum 
        switch(CommandSet.valueOf(String.valueOf(object)){
            case command1: doStuff1();break;
            case command2: doStuff2();break;
            ...
            case commandN: doStuffN();break;
        }
    // other methods
    void doStuff1(){
        ...
    }
    ...
    void doStuffN(){
        ...
    }
}

public class NonStandardCommads extends Commands implements Observer{
    // Another set of commands here for the enum keeping the same methods it had in the parent

    // update inherited from Observer
    @Override
    public void update(Observable observable, Object object) {
        // Other set of commands inside this class used in the switch statement
        switch(CommandSet.valueOf(String.valueOf(object)){
            case Zcommand1: doStuffz1();break;
            case Zcommand2: doStuffz2();break;
            ...
            case ZcommandN: doStuffzN();break;
        }
    // other methods
    void doStuffz1(){
        ...
    }
    ...
    void doStuffzN(){
        ...
    }
}
public static class Command {
  protected String code;
  protected String desc;
  public String getCode() {return code;}
  public String getDesc() {return desc;}
  public Command (String code, String desc) {
    this.code = code;
    this.desc = desc;
  }
  public String toString() {return code;}
}

public class StandardCommands {
  public static Command READ = new Command("READ", "read a record");
  public static Command CREATE = new Command("WRITE", "create a record");
  public static Command EDIT = new Command("WRITE", "modify a record");
}
public class FurtherCommands extends StandardCommands {
  public static Command LIST = new Command("LIST", "list all records");
}

public class QueryCommands extends FurtherCommands {
  public static class QueryCmd extends Command {
    protected String search;
    public String getSearch() {return search;}
    // constructor..
  }
  public static QueryCmd QUERY_EXAMPLE = new QueryCmd("QUERY", "example", "query for specified string");


  public static QueryCmd createQuery (String search) {
    return new QueryCmd( "QUERY", search, "query for specified string");
  }
}