“替代方案”;扩展;Java枚举

“替代方案”;扩展;Java枚举,java,inheritance,enums,Java,Inheritance,Enums,我正在做一个非常简单的ALife-esque应用程序,我希望有以下具有以下继承关系的类: (摘要)生命形式我认为这不是一个枚举问题,而是一个状态机问题。 您有一个名称State,这对我来说意味着您实际上正在使用状态机。我不会为此使用enum,而是实际建模一个适当的状态机 从您在问题中发布的状态来看,它们也意味着一个有限状态机。我认为您只是要围绕这些enum实现某种状态机,作为最终结果,应该继续并从最终将要结束的地方开始 在过去,我曾经非常有效地简化了状态转换的创建和管理 看起来也是一个很好的解决

我正在做一个非常简单的ALife-esque应用程序,我希望有以下具有以下继承关系的类:

(摘要)生命形式我认为这不是一个枚举问题,而是一个状态机问题。 您有一个名称
State
,这对我来说意味着您实际上正在使用状态机。我不会为此使用
enum
,而是实际建模一个适当的状态机

从您在问题中发布的状态来看,它们也意味着一个有限状态机。我认为您只是要围绕这些
enum
实现某种状态机,作为最终结果,应该继续并从最终将要结束的地方开始

在过去,我曾经非常有效地简化了状态转换的创建和管理

看起来也是一个很好的解决方案

您可以做您想做的事情的唯一方法是滚动您自己的1.4版本之前的TypeSafe枚举 在Java将
enum
作为一种类型之前,我在IDE中使用了一个模板,创建了一个更丰富的语言实现

它本质上只是一个Java类,具有
final
实例成员和
private
构造函数和
public final静态
实例


我仍然要提醒大家,扩展
enum
是不允许的,因为有一个很好的理由,试图解决它可能会给你带来比解决问题更多的痛苦。

这是我多年来一直使用的解决方案,以防它对某人有所帮助。我已经重写了一些

注意:它故意不实现价值支持。这不是一个困难的改变,坦率地说,我没有使用它们,所以我把它拔了出来。我还改写了我原来的古老版本

注意:我在这里提供它主要是因为它包含toString()支持,可以从任何子类生成字段名(无论您使用了什么)

我还将访问限制导致的字段错误指定为灾难性(执行结束)错误。您可以将其修改为您选择的任何异常处理,但我建议您保持原样

package tgm.utils;

import java.lang.reflect.Field;


public abstract class InheritableEnum
{
    protected InheritableEnum() {}

    public String toString()
    {
        String returnStr = "Unknown InheritableEnum["+super.toString()+"]";

        Field[] fields = this.getClass().getFields();        
        for (Field f : fields)
        {
            try
            {
                if (f.get(this) == this)
                {
                    returnStr = f.getName();
                    break;
                }
            }
            catch(IllegalAccessException e)
            {
                System.err.println("Illegal access on field["+f+"]");
                e.printStackTrace();
                System.exit(-1);
            }
        }

        return returnStr;
    }
}
然后你会用同样的方法:

public class State extends InheritableEnum
{
    public static final State DEAD    = new State();
    public static final State EATING  = new State();
    public static final State GROWING = new State();
}

您可以在一个
enum
中包含所有状态,并验证类的确切状态。或者您可以使用单独的
enum
s.@Luiggi,这是我早些时候拒绝的第一个解决方案,因为它涉及到让基类维护所有潜在子类的信息。一个粗鲁的生命形式不应该这样做。第二种方法可以防止Lifeform类根据需要更改状态。在Java中,您无法从
枚举扩展,因此您的用例不可能如此。有两种选择,可能您不应该使用
enum
来解决此问题。如果您愿意,可以让enum实现接口,前提是enum需要有特定的方法。但是你所做的不是一个选项。@Luiggi,是的,这是我开始的初始前提——枚举本身无法解决这个问题。我不清楚这里最干净的路线是什么。国家需要生活在每一个层面。我希望维持生物的层次结构(而不是一个生命形式,它可以简单地自行进化成任何东西,并且仍然保持它自己的等级),我不希望任何一个特定的层次能够洞察到次级层次,坦率地说,这将是粗俗的。很可能是这样的。然而,对我来说,练习是手工构建这样一个状态机,这只是一个例子。我已经建立了自己的SM,它的功能正如我所期望的。然而,我正试图在通过基因组继承的不同层次上构建功能,这涉及到让超类管理它们自己理解的状态。考虑下面的安排,我没有把这个问题(故意)提出来:(抽象)生命形式是的,事实上,这是我从1997以来使用的相同的解决方案。从您的警告听起来,如果我打算以继承的方式使用任何类似enum的东西,那么我的方向是错误的。因为我确实希望抽象超类(“supercreatures”,我想)能够识别和修改状态,如果只是通过一组默认的受保护方法,这些方法以后可能会被覆盖,也可能不会被覆盖。顺便说一句,您是否碰巧看到了这个beastie:javax.print.attribute.EnumSyntax?
public class State extends InheritableEnum
{
    public static final State DEAD    = new State();
    public static final State EATING  = new State();
    public static final State GROWING = new State();
}