Java производный класс не создает автоматически экземпляр - PullRequest
0 голосов
/ 20 апреля 2011

У меня есть базовый класс абстрактного логгера, в котором есть переменная экземпляра, которую я хочу, чтобы производный класс автоматически устанавливал код при создании кода.Итак, вот базовый класс:

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 или редактирование в классе CLog, которое не зависит от AndroidLog, чтобысделать эту работу?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Простое существование класса AndroidLog не приведет к самозагрузке!

В Java классы загружаются и инициализируются при их использовании, а не до!Поэтому, если какой-либо ваш класс где-то не ссылается на AndroidLog соответствующим образом, он никогда не будет загружен, его статические поля никогда не инициализируются и его конструктор никогда не будет вызван.

0 голосов
/ 20 апреля 2011

Другим важным аспектом является тот факт, что частные статические члены класса не наследуются!Ваш класс AndroidLog не будет иметь доступа ни к одному из закрытых статических членов базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...