簡単な質問: クラス内の何かが参照されているときにクラスを完全にロードする方法はありますか? 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 メソッドなど) があるため、プロセスが異なる型に分割されました。簡潔にするために、問題の一部ではないため、コードは含めていません。テストでは、すべてのアイテムが期待どおりに結合されていることを確認しました (以下で明確にするように、クラッジが含まれています)。
次に、テストページにこれがあります:
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
}