Как работает цикл с Instance? - PullRequest
0 голосов
/ 03 марта 2019

При поиске метода, который на самом деле записывает журнал в файл в библиотеке log4j, обнаружен метод ниже

  public void callAppenders(LoggingEvent event) {
    int writes = 0;
    for (Category c = this; c != null; c = c.parent) {
      synchronized (c) {
        if (c.aai != null) {
          writes += c.aai.appendLoopOnAppenders(event);
        }
        if (!c.additive) {
          break;
        }
      }
    }
    if (writes == 0) {
      this.repository.emitNoAppenderWarning(this);
    }
  }

Но я не могу понять, что происходит в цикле for.Может ли кто-нибудь помочь мне понять, что здесь происходит?Никогда не сталкивался с подобным фрагментом кода ..!

Обновление:

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

  public void log(String callerFQCN, Priority level, Object message, Throwable t) {
    if (this.repository.isDisabled(level.level)) {
      return;
    }
    if (level.isGreaterOrEqual(getEffectiveLevel())) {
      forcedLog(callerFQCN, level, message, t);
    }
  }

И отсюда происходит принудительный метод

  protected void forcedLog(String fqcn, Priority level, Object message, Throwable t) {
    callAppenders(new LoggingEvent(fqcn, this, level, message, t));
  }

, который в конечном итоге вызывает упоминание callAppenders упоминания метода сверху.И protected volatile Category parent; присутствует в классе Category, где все вышеперечисленные методы также являются частью этого класса.

Спасибо

1 Ответ

0 голосов
/ 03 марта 2019

Возможно, вы привыкли видеть циклы типа

for (int i=0; i<10; i++) { ... }

и понимаете, что это повторяет i от 0 до 10, то есть 9.

Возможно, вы нашли синтаксис этого цикла немного странным, но никогда не задумывались об этом.Итак, давайте сделаем это сейчас.

  • Первая часть int i=0 - это оператор, который создает начальное состояние итерации.Здесь он определяет новую целочисленную переменную с именем i и инициализирует ее как 0.Вот почему этот цикл начинается с 0.
  • Вторая часть i<10 является логическим выражением, которое решает, следует ли (в дальнейшем) выполнять тело цикла.Этот определяет, что цикл должен повторяться до тех пор, пока i меньше 10.
  • Третья часть i++ определяет, что нужно изменить с итерации на итерацию.Здесь он увеличивается i на 1.

Теперь давайте посмотрим на фрагмент

for (Category c = this; c != null; c = c.parent) { ... }
  • Первая часть Category c = this создает новыйпеременная типа Category и инициализирует ее как this.Итак, для первой итерации c будет this.
  • Вторая часть c != null определяет, что цикл повторяется до тех пор, пока Category c не будет null.
  • Третья часть c = c.parent определяет, что в каждой следующей итерации цикла используется родительский элемент текущей категории.

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

Итак, итерации:

  • c = this;
  • c = this.parent;
  • c = this.parent.parent;
  • c = this.parent.parent.parent;

до тех пор, пока c не станетnull (потому что какой-то конечный родитель сам имеет нулевого родителя).Тело цикла не создает и не изменяет никакие экземпляры Category, что означает, что цикл просто следует родительской иерархии Category, которая была установлена ​​до запуска цикла.

Итак, если вы использовали шаблон for (int i=0; i<10; i++) { ... }, такдалеко, вы упустили много силы и гибкости в петле for.

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