Преимущество возврата упакованных примитивных значений из библиотечной функции

#java #primitive-types #jedis #boxing #lettuce

#java #примитивные типы #jedis #упаковка #салат

Вопрос:

Контекст

Я рассматриваю пару клиентов Java Redis, таких как Lettuce и Jedis. Я вижу, что обе библиотеки определили свои методы для возврата упакованных примитивных типов, а не прямых примитивов.

Например, sadd() возвращает Long , а не просто long . https://lettuce.io/lettuce-4/release/api/com/lambdaworks/redis/api/sync/RedisSetCommands.html#sadd-K-V…-
и
https://github.com/xetorthio/jedis/blob/d7aba13a8b65e66dedc01c51b73e3794cbe68a62/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java#L139

Вопрос

Что может быть причиной возврата упакованных примитивов?
Насколько я понимаю, боксирование увеличивает накладные расходы на производительность.

Имеет ли смысл для моей библиотеки, которая использует библиотеку Redis, сохранять возвращаемые значения в штучной упаковке и распространять их среди пользователей библиотеки?

Редактировать: Ни один из методов не возвращает null , поэтому кодирование особого значения в null к ним не применяется.

Ответ №1:

На мой взгляд, основная причина заключается в возможности извлечения Object вместо примитивного типа. Например. это возможно для извлечения null .

Числовые оболочки, такие как Integer , Long …, являются кэшированными значениями между -128; 127 . Все остальные значения будут дублироваться в памяти. Более того, для хранения Long требуется в 3 раза больше места, чем для хранения long .

В общем случае я следую следующему правилу. Если вам не нужно возвращать null , вы должны предпочесть возвращать примитивное значение, а не числовую оболочку.

Комментарии:

1. В качестве отступления: верхним пределом кэша можно управлять с помощью системного свойства java.lang.Integer.IntegerCache.high=...

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

Ответ №2:

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

Комментарии:

1. Правильно. Я отредактирую свой ответ, чтобы прояснить это. Спасибо, что указали на это.

2. хорошие моменты. Я могу видеть долго. двойное преимущество может быть при использовании со сжатыми oops. Вы должны передавать 32-разрядные значения вместо 64-разрядных