0

简短的问题:当引用类内部的任何内容时,有没有办法完全加载一个类?Class.forName(...) 没有这样做,我不想想出一个实际上并不能解决问题的笨拙的解决方法(如下所示)。

详细的问题/场景:我有一些基本的枚举定义:

public class V_Type
{
public static interface Datatype
    {
    public boolean Allow (Object pCandidate) ;
    }

public static enum Domain_y {A,I,N,T;
    public Datatype CoreDatatype ;
    }

public static enum String_y implements Datatype
    {
    Text    (null   ,Domain_y.T)
    ,Alpha  (Text   ,Domain_y.A)
    ;
    String_y (Datatype pParent, Domain_y pDomain)
        {
        V_Type.Index.Register(this, pParent, pDomain) ;
        }
    public boolean Allow (Object pCandidate) {return true;}
    }

public static enum Decimal_y implements Datatype
    {
    Notational  (String_y.Alpha ,Domain_y.N)
    ,Fractional (Notational     ,null)
    ;
    Decimal_y (Datatype pParent, Domain_y pDomain)
        {
        V_Type.Index.Register(this, pParent, pDomain) ;
        }
    public boolean Allow (Object pCandidate) {return true;/*TODO : Validate decimal data*/}
    }

public static enum Integer_y implements Datatype
    {
    Expressive  (Decimal_y.Fractional   ,Domain_y.I)
    ,Conversive (Expressive             ,null)
    ;
    Integer_y (Datatype pParent, Domain_y pDomain)
        {
        V_Type.Index.Register(this, pParent, pDomain) ;
        }
    public boolean Allow (Object pCandidate) {return true;/*TODO : Validate integer data*/}
    }

}

它基本上只是一组分类对象。所有枚举都通过每个构造函数中的 V_Type.Index.Register 调用链接在一起。Integer_y 枚举链接到 Decimal_y 枚举,而 Decimal_y 枚举引用 String_y 枚举。每种枚举类型在处理数据时都有不同的行为(例如上面提到的 Allow 方法),这就是进程在不同类型之间拆分的原因。为简洁起见,我没有包含代码,因为它不是问题的一部分。在测试中,我已经确认所有项目都按预期连接在一起(包括 kludge,我将在下面澄清)。

然后,在测试页面上我有这个:

public class x_LazyHiccup
{
public static void List (ArrayList<V_Type.Datatype> pDatatypes, String pLevel)
    {
    for (V_Type.Datatype oDatatype : pDatatypes)
        {
        System.out.println(pLevel + oDatatype.toString());
        ArrayList<V_Type.Datatype> oDatatypes = V_Type.Index.Children(oDatatype) ;
        List (oDatatypes, pLevel + "\t") ;
        }
    }

public static void main (String [] pArgs)
    {
    V_Type.LoadTaxonomy() ;

    List(V_Type.Index.Top(), "");
    }

}

这贯穿分类并报告所有枚举都连接在一起,如下所示:

Text

    Alpha

        Notational

            Fractional

                Expressive

                    Conversive

即它是一个层次结构,所有的父/子关系都是正确的形式。但是,这有效的唯一原因是因为这种方法:

public static void LoadTaxonomy ()
    {
    if (Integer_y.Conversive == null) ; // Do nothing. Just forces the bottom state into existence
    }

通过引用最底部的枚举,所有枚举都被构造并正确链接在一起。然而,如果没有这个测试,延迟加载过程根本不会加载任何枚举,即使我在类中引用对象和方法,它也只会加载被引用的项目。如果 LoadTaxonomy 方法更改为:

public static void LoadTaxonomy ()
    {
    if (Decimal_y.Notational == null) ;
    }

完整的层次结构消失了:

Text

    Alpha

        Notational

            Fractional

即整数枚举不存在,直到它被某些东西引用。

班级本身可以为此做些什么吗?我需要知道所有枚举都以一致和同步的方式加载在一起。我在类定义中尝试了这个,它完全没有做任何事情:

static
    {
    LoadTaxonomy() ; // Nope, not going to happen
    }
4

1 回答 1

0

您可以编写自己的类加载器,但我认为这可能是错误的方法。在我看来,您应该将类​​型和注册表的定义分开。如果不了解分类领域和最后的用法,我将通过多态而不是枚举来解决/设计这个问题。

于 2013-11-10T21:52:20.000 回答