Как для цикла работ с Instance?

Вопрос задан: 1 год назад Последняя активность: 1 год назад
up 1 down

При поиске метода, который на самом деле пишет журнал в файл в библиотеке 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);
    }
  }

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

Обновить:

Я код, где он использует один метод для входа в лог-файлах. И в рамках этого метода он называет ниже метод, который приходит из библиотеки 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);
    }
  }

И отсюда метод forcedLog

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

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

Спасибо

1 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 1 down

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

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 определяет, что цикл повторяется до тех пор, пока Категория c не null.
  • Третья часть c = c.parent определяет, что каждая следующая итерация использует родительскую текущую категорию.

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

Таким образом, итерации:

  • с = это;
  • с = this.parent;
  • с = this.parent.parent;
  • с = this.parent.parent.parent;

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

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

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском