2

静的レジストリの適切な使用をチェックする方法として:

class AClass {
     static final IDType = IDregistry.registerId(...);
}

class IDRegistry {
     public static registerId(...)
     {
          if(isCalledInStaticInitializer()) {
               return(new IDType(...));
          }
          assert false : "NO NO - can't do this !!!";
     }
}
4

3 に答える 3

3

私はあなたがこれをするべきではないと思います。しかし、あなたが主張するなら、これはあなたを始めるでしょう:

public static boolean isCalledInStaticInitializer()
{
    for (StackTraceElement ste : Thread.currentThread().getStackTrace())
    {
        if("<clinit>".equals(ste.getMethodName()))
        {
            return true;
        }
    }
    return false;
}

出典: JVM 仕様のセクション 2.9 (「特殊メソッド」):

"クラスまたはインターフェースは、最大で 1 つのクラスまたはインターフェースの初期化メソッドを持ち、そのメソッドを呼び出すことによって初期化されます (§5.5)。クラスまたはインターフェースの初期化メソッドには、特別な名前があります<clinit>"

于 2012-04-05T23:50:58.597 に答える
1

あなたの意図は不必要です(誰もやったことがありません - 私は見たことがないなど)。

あなたが望むのは、単にこれです:

static final IDType id = new IDType(...);

ID をどこかに登録する必要があるIDType場合は、IDType が不変の場合はそのコードをコンストラクターに入れます。または、IDType が変更可能である場合 (可能性は低い) 1 つのオプションは、IDType でファクトリ メソッドを使用して作成および登録することです。

public class IDType() {
    ...
    public static IDType createAndRegister(...) {
        IDType idType = new IDType(...);
        SomeClass.register(idType);
        return idType;
    }
}
于 2012-04-05T23:31:57.390 に答える