0

コードの作成時に派生クラスによって自動的に設定されるインスタンス変数を持つ基本抽象ロガー クラスがあります。したがって、ここに基本クラスがあります:

abstract public class CLog 
{
    /** Maintains the call stack level for each thread */
    private static HashMap<Integer, Integer> callStackLevel = new HashMap<Integer, Integer>();

    /** Static instance to be set by the derived class */
    private static CLog instance = null;

    /** Logs in verbose */
    public static void v(String message) { if(instance != null) instance.verbose(getMessage(message)); }
    /** Logs in debug */
    public static void d(String message) { if(instance != null) instance.debug(getMessage(message)); }
    /** Logs in informational */
    public static void i(String message) { if(instance != null) instance.info(getMessage(message)); }
    /** Logs in warning */
    public static void w(String message) { if(instance != null) instance.warn(getMessage(message)); }
    /** Logs in error */
    public static void e(String message) { if(instance != null) instance.error(getMessage(message)); }

    /**
     * Calculates the message (with header)
     */
    private static String getMessage(String message)
    {
        ...
    }

    /** Constructor sets instance */
    protected CLog() { instance = this; }

    /** Logs in verbose */
    protected abstract void verbose(String message);
    /** Logs in debug */
    protected abstract void debug(String message);
    /** Logs in informational */
    protected abstract void info(String message);
    /** Logs in warning */
    protected abstract void warn(String message);
    /** Logs in error */
    protected abstract void error(String message);
}

Android ロガーの派生クラスを作成します。コンストラクターを自動的に呼び出したいのですが、すべてのログ機能から何も結果が得られないため、これは機能していないようです。

public class AndroidLog extends CLog 
{
    protected static AndroidLog derived = new AndroidLog();

    @Override
    protected void debug(String message) {
        Log.d("Crystal", message);
    }

    @Override
    protected void error(String message) {
        Log.e("Crystal", message);
    }

    @Override
    protected void info(String message) {
        Log.i("Crystal", message);
    }

    @Override
    protected void verbose(String message) {
        Log.v("Crystal", message);
    }

    @Override
    protected void warn(String message) {
        Log.w("Crystal", message);
    }
}

なぜこれが機能しないのですか?基本クラスで静的関数を呼び出すと、ログが取得されません。

AndroidLog クラスを編集するだけで、または AndroidLog に依存しない CLog クラスを編集して、これを機能させることはできますか?

4

2 に答える 2

2

クラスが存在するだけでは、AndroidLogそれ自体がブートストラップすることはありません!

Java クラスは、使用前ではなく、使用時にロードおよび初期化されます。したがって、どこかのクラスがAndroidLog関連する方法で参照しない限り、ロードされることはなく、静的フィールドは初期化されず、コンストラクターは呼び出されません。

于 2011-04-20T07:37:03.810 に答える
0

もう1つの重要な側面は、プライベート静的クラスメンバーが継承されないという事実です。AndroidLogクラスは、基本クラスのプライベート静的メンバーにはアクセスできません。

于 2011-04-20T11:34:37.520 に答える