Что такое “регистратор” в Java?

У меня есть класс, в котором я вижу следующие вещи:

this.logger.severe("");
this.logger.warning("");
this.logger.info("");

Я не понимаю несколько вещей:

  1. Как мы можем использовать метод, который не был определен ранее? Я имею в виду, нет никаких методов "регистратора", определенных в классе. Я думал, что эти методы могли быть определены, потому что продуманный класс является расширением другого класса, в котором определяется "регистратор". Но в определении класса там не "расширяет" оператор (только "реализации").

  2. Я могу понять подобные вещи: "objectName.methodName". Но каково то "имя объекта something1.something2"? "something1.something2" является названием метода? Имена методов могут содержать точки?

  3. Что точно они "регистратор.*"? Я думаю, что они сохраняют информацию о выполнении кода. Они вид пишет отчет о том, что произошло во время выполнения. Но где я могу найти эту информацию?

ДОБАВЛЕННЫЙ:

В начале файла я имею: import java.util.logging.Logger;
И затем в классе я имею: private Logger logger = Logger.getLogger("a.b.c.d");
Так, регистратор является объектом класса Регистратор (но я не понимаю, почему они не могли инстанцировать класса в обычном способе использовать "новый Регистратор ()). Я также не понимаю то, что точно logger.severe ("") делают.

9
задан Roman 9 March 2010 в 17:44
поделиться

4 ответа

  1. Регистратор обычно относится к использованию класса в log4j .
  2. Регистратор - это объект-член, функция которого, например, суровый называется.
  3. Регистратор обычно регистрируется в файле (это можно настроить с помощью log4j.xml или другого файла конфигурации или во время запуска программы).

Редактировать: Изменена ссылка на log4j.

3
ответ дан 4 December 2019 в 10:03
поделиться

Регистратор ничего особенного не делает. Это всего лишь код Java.

public class SomeClass {
    private Logger logger = LogFactory.getLogger(SomeClass.class);

    public void doSomething() {
        this.logger.debug("foo");
    }
}

this.logger просто указывает на переменную экземпляра с именем logger текущего экземпляра ( this ). this. Между прочим, в этом примере префикс лишний. Можно также просто выполнить здесь logger.debug ("foo") .

Если он не объявлен в самом SomeClass , то, скорее всего, он был объявлен в расширяющемся классе. Проверьте класс, объявленный в extends .

Что касается вашего objectName.something1.something2 сомнения, вы уже смотрели, как работает System.out.println () ? System.out возвращает объект PrintStream , который, в свою очередь, имеет метод println () . Таким образом, если objectName.something возвращает полноценный Object с методами, то вы можете просто продолжить объединение вызовов методов в цепочку.

В принципе,

objectName.something1.something2;

можно перевести как

SomeObject someObject = objectName.something1;
someObject.something2;

Но если вам не нужен someObject где-либо еще в коде, то его можно просто сократить, как в вашем примере.

Обновление : согласно вашему обновлению:

Итак, регистратор является объектом класса Logger (но я не понимаю, почему они не могли создать экземпляр класса обычным способом с помощью "new Logger ()") . Я также не понимаю, что именно делает logger.severe ("").

Просто прочтите javadoc рассматриваемого класса, что он все делает . Что касается того, почему он не может быть создан, это из-за заводской образец .

Обновление 2 : согласно другому недоразумению:

Я не понимаю, почему они используют «это». То есть, если я использую только имя поля, не будет ли оно по умолчанию полем этого объекта? Есть ли разница между «this.x» и «x»?

Таким образом, вы можете более четко указать, к какому из них вы хотите получить доступ. Если метод содержит, например, аргумент или локальную переменную с именем logger , тогда this.logger все равно будет ссылаться на переменную экземпляра.

public class SomeClass {
    private Logger logger = LogFactory.getLogger(SomeClass.class);

    public void doSomething(Logger logger) {
        this.logger.debug("foo"); // Refers to the instance variable.
        logger.debug("foo"); // Refers to the method argument.
    }

    public void doSomethingElse() {
        Logger logger = LogFactory.getLogger(SomeClass.class);
        this.logger.debug("foo"); // Refers to the instance variable.
        logger.debug("foo"); // Refers to the method local variable.
    }
}
13
ответ дан 4 December 2019 в 10:03
поделиться

logger - это не метод, а переменная класса, которая, похоже, является объектом, раскрывающим методы "severe", "warning" и "info".

Проверьте свой класс на наличие чего-то вроде "someClass logger = new someClass();"

1
ответ дан 4 December 2019 в 10:03
поделиться
  1. Регистратором будет другой объект, а не метод. В этом классе регистратора будут определены методы типа public void strict (String message)

  2. «something1» будет объектом, содержащимся в «objectName». Например, Car.Engine.Cylinder.Fire () , считается плохой практикой использовать метод зажигания цилиндров автомобиля, подобный этому, и вам следует сделать что-то вроде Car.StartEngine () (см. закон Деметра для получения дополнительной информации)

  3. Регистратор будет вести запись того, что произошло в вашей программе, поэтому, если позже произойдет сбой или ошибка, вы можете увидеть, что случилось. Будет ли это записано в текстовый файл или где-нибудь в базе данных, зависит от реализации вашего регистратора.

3
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: