简短的问题:当引用类内部的任何内容时,有没有办法完全加载一个类?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
}