Java 8 requireNonNull метод с производительностью параметра поставщика - PullRequest
0 голосов
/ 16 января 2019

Метод Objects.requireNonNull с добавлением Supplier в Java 8, но я не уверен, что объявлено улучшение производительности:

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

Метод со строкой игнорирует параметр, если не ноль:

public static <T> T requireNonNull(T obj, String message) {
    if (obj == null)
        throw new NullPointerException(message);
    return obj;
}

Я нашел JDK-8011800: Добавить java.util.Objects.requireNonNull (T, Поставщик)

В JDK 7 java.util.Objects включал несколько методов для проверки на нулевое значение, в том числе один, который принимал сообщение для возврата, если нулевое было найдено. С лямбдами в JDK 8, другой вариант для включения - это метод requireNonNull, который принимает строку-поставщика вместо строки. Поэтому можно избежать стоимости создания строкового сообщения для ненулевого случая. Обратите внимание, что лямбда-захват может иметь ненулевую стоимость.

С комментариями указывается отсутствие влияния на производительность:

Меня беспокоит ненулевая стоимость захвата. Я обеспокоен тем, что это часто стирает любые преимущества использования Поставщика. 09-04-2013

Я нашел другие вопросы, но не относящиеся к (почему) отправка параметра String приводили к снижению производительности

Это специфично для лямбда-выражений / использования потока?

1 Ответ

0 голосов
/ 16 января 2019

Учтите это, когда 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!");
...