У меня есть класс, в котором я вижу следующие вещи:
this.logger.severe("");
this.logger.warning("");
this.logger.info("");
Я не понимаю несколько вещей:
Как мы можем использовать метод, который не был определен ранее? Я имею в виду, нет никаких методов "регистратора", определенных в классе. Я думал, что эти методы могли быть определены, потому что продуманный класс является расширением другого класса, в котором определяется "регистратор". Но в определении класса там не "расширяет" оператор (только "реализации").
Я могу понять подобные вещи: "objectName.methodName". Но каково то "имя объекта something1.something2"? "something1.something2" является названием метода? Имена методов могут содержать точки?
Что точно они "регистратор.*"? Я думаю, что они сохраняют информацию о выполнении кода. Они вид пишет отчет о том, что произошло во время выполнения. Но где я могу найти эту информацию?
ДОБАВЛЕННЫЙ:
В начале файла я имею: import java.util.logging.Logger;
И затем в классе я имею: private Logger logger = Logger.getLogger("a.b.c.d")
;
Так, регистратор является объектом класса Регистратор (но я не понимаю, почему они не могли инстанцировать класса в обычном способе использовать "новый Регистратор ()). Я также не понимаю то, что точно logger.severe ("") делают.
Редактировать: Изменена ссылка на log4j.
Регистратор ничего особенного не делает. Это всего лишь код 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.
}
}
logger - это не метод, а переменная класса, которая, похоже, является объектом, раскрывающим методы "severe", "warning" и "info".
Проверьте свой класс на наличие чего-то вроде "someClass logger = new someClass();"
Регистратором будет другой объект, а не метод. В этом классе регистратора будут определены методы типа public void strict (String message)
«something1» будет объектом, содержащимся в «objectName». Например, Car.Engine.Cylinder.Fire ()
, считается плохой практикой использовать метод зажигания цилиндров автомобиля, подобный этому, и вам следует сделать что-то вроде Car.StartEngine ()
(см. закон Деметра для получения дополнительной информации)
Регистратор будет вести запись того, что произошло в вашей программе, поэтому, если позже произойдет сбой или ошибка, вы можете увидеть, что случилось. Будет ли это записано в текстовый файл или где-нибудь в базе данных, зависит от реализации вашего регистратора.