Ход выполнения примера закрытия | Java 8

Итак, это решило эту проблему:

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;

...

static Logger root = (Logger) LoggerFactory
        .getLogger(Logger.ROOT_LOGGER_NAME);

static {
    root.setLevel(Level.INFO);
}

Вы можете установить Level на более высокий Level, если вы хотите скрыть все журналы.

1
задан Soumava Das 3 March 2019 в 02:30
поделиться

2 ответа

Замыкания позволяют моделировать поведение, инкапсулируя и код, и контекст в одну конструкцию.

Ключевая концепция заключается в том, что код вашей функции (лямбда) может ссылаться не только на свои собственные переменные, но также на все, что не видно для кода, переменные a и b в вашем случае.

В Java замыкания могут ссылаться только на конечные или эффективно конечные переменные. Это означает, что ссылка на переменную не может быть изменена, и замыкание видит только фактическое неизменяемое состояние (значение на самом деле не является неизменным, окончательное означает, что переменная не может быть переназначена). В теории это не обязательно. Например, в JavaScript вы можете написать такой код:

function newCounter() { 
    let count = 0; 
    return function() { return ++count; }; 
} 
const nc = newCounter(); 
console.log(nc()); // 1 
console.log(nc()); // 2 
console.log(nc()); // 3

Здесь внутренняя функция newCounter по-прежнему имеет доступ к count (его контекст) и может изменять его (переменная является изменяемой) .

Обратите внимание, что переменная counter недоступна для любых других частей вашего кода за пределами замыкания.

0
ответ дан ttulka 3 March 2019 в 02:30
поделиться

Замыкания позволяют вам обращаться к переменным в их внешних областях. Внешняя переменная области видимости в этом случае (b) объявляется как то, что Java-сообщество теперь называет фактически финальным, то есть ее значение не изменяется с момента инициализации (int b = 20) Чтобы быть доступным.

Имейте в виду, что переменные должны быть объявлены как окончательные или эффективно окончательные, чтобы это работало как замыкания.

Теперь, что касается вашего кода, этот код объявляет метод doProcess (...) , который возвращает метод для частичного выполнения метода doProcess (...) .

Метод process (...) обращается к b во внешней области видимости метода doProcess (...) , который объявлено окончательно окончательным.

0
ответ дан MS90 3 March 2019 в 02:30
поделиться
Другие вопросы по тегам:

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