ДА, вы можете изменить переменные-члены экземпляра, но вы НЕ МОЖЕТЕ изменить сам экземпляр так же, как при обработке переменных.
Что-то вроде этого, как упоминалось:
class Car {
public String name;
}
public void testLocal() {
int theLocal = 6;
Car bmw = new Car();
bmw.name = "BMW";
Stream.iterate(0, i -> i + 2).limit(2)
.forEach(i -> {
// bmw = new Car(); // LINE - 1;
bmw.name = "BMW NEW"; // LINE - 2;
System.out.println("Testing local variables: " + (theLocal + i));
});
// have to comment this to ensure it's `effectively final`;
// theLocal = 2;
}
Основной принцип ограничения локальных переменных - это данные и достоверность вычислений
Если лямбда, оцененная вторым потоком, была дана возможность мутировать локальные переменные. Даже возможность считывать значение изменчивых локальных переменных из другого потока приведет к необходимости синхронизации или использования изменчивых во избежание чтения устаревших данных.
Но, как мы знаем, Основная цель lambdas
. Среди различных причин этого наиболее актуальным для платформы Java является то, что они упрощают распространение обработки коллекций по нескольким потоки.
В отличие от локальных переменных локальный экземпляр может быть мутирован, поскольку он разделяется глобально. Мы можем понять это лучше с помощью разницы кучи и стека :
Всякий раз, когда создается объект, он всегда сохраняется в пространстве кучи, а в стеке содержится ссылка на него ,
Так что, чтобы суммировать, есть две точки, которые, я думаю, действительно имеют значение:
- Очень сложно сделать экземпляр эффективным окончательным , что может вызвать много бессмысленного бремени (просто представьте себе глубоко вложенный класс);
- сам экземпляр уже глобально разделен и lambda также разделяется между потоками, поэтому они могут работать вместе правильно, поскольку мы знаем, что мы обрабатываем мутацию и хотим передать эту мутацию;
Балансовая точка здесь понятна: если вы знаете, что делаете, вы можете сделать это легко, но если нет, то ограничение по умолчанию поможет избежать коварных ошибок ,
P.S. Если требуется синхронизация в мутации экземпляра, вы можете напрямую использовать методы сокращения потока или, если есть проблема с зависимостями в мутации экземпляра, вы все равно можете использовать
thenApply
илиthenCompose
в Функция , тогда какmapping
или методы аналогичны.
Использовать вид по умолчанию, установленный для состояния.
...
views: {
'': {
controller: 'loginController'
}
}
...
...
views: {
'': {
controller: 'loginEmailController',
templateUrl: '/components/loginEmail/loginEmailView.html'
}
}
...