Java 8 requireNonNull метод с производительностью параметра поставщика

Это лучшее объяснение, которое я видел. Понимать JavaScripts это с помощью Clarity

Ссылка эта ALLWAYS означает (и содержит значение) объект - особый объект - и он обычно используется внутри функции или метода, хотя он может использоваться вне функции в глобальной области. Обратите внимание, что когда мы используем строгий режим, это содержит значение неопределенных в глобальных функциях и анонимных функциях, которые не привязаны к какому-либо объекту.

Существуют четыре условия, в которых это может запутать:

  1. Когда мы передаем метод (который использует этот ) в качестве параметра, который будет использоваться в качестве функции обратного вызова.
  2. Другой пример, когда это неправильно понимается, - это когда мы используем внутренний метод (замыкание). Важно отметить, что закрытие не может получить доступ к переменной этой внешней функции внешней функции], используя это ключевое слово, потому что эта переменная доступна только самой функции, а не внутренними функциями.
  3. Используя этот , когда метод присваивается переменной. Значение этого привязано к другому объекту, если мы назначим метод, который использует это для переменной
  4. Используя этот при использовании bind, apply и

Он дает примеры кода, объяснения и исправления кода, которые, как я думал, очень полезны.

3
задан user7294900 16 January 2019 в 11:18
поделиться

1 ответ

Рассмотрим это, когда generateString делает много вещей для генерации строки из someParam:

Objects.requireNonNull(obj, generateString(someParam));

Аргументы оцениваются с нетерпением в Java, что означает, что generateString будет оценивается до вызова requireNonNull. Поэтому он вычисляется независимо от того, является ли obj нулевым или нет.

Вы можете исправить эту проблему, изменив ее следующим образом:

Objects.requireNonNull(obj, () -> generateString(someParam));

В этом случае вызов generateString будет вызван только в том случае, если obj на самом деле было нулевым. Это более эффективно, когда generateString дороже, чем создание Supplier -объекта.

Вы должны просто использовать обычный не лямбда-метод, если ваш параметр String является просто литералом, например:

Objects.requireNonNull(obj, "obj was null!");
0
ответ дан marstran 16 January 2019 в 11:18
поделиться
Другие вопросы по тегам:

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