从库函数返回装箱原始值的优点
Advantage of returning boxed primitive values from library function
上下文
我正在查看几个 Java Redis 客户端,例如 Lettuce 和 Jedis。我看到两个库都将它们的方法定义为 return 盒装原始类型而不是直接原始类型。
例如,sadd()
returns 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
问题
return装箱基元的原因可能是什么?
据我了解,装箱会增加性能开销。
对于我使用 Redis 库的库来说,保留 return 值并将其传播给库的用户有意义吗?
编辑:None 方法 return null
,因此将特殊含义编码为 null 不适用于它们。
盒装基元可以在集合中使用,而常规基元不能(尽管它们仍然可以添加到相应盒装类型的集合中),并且还允许您使用引用而不是值,这样可以节省时间和 space 在某些情况下(即当引用的大小小于数据的大小时)。但是正如您所说,盒装基元会产生内存成本和性能开销。
在我看来,主要原因是能够检索 Object
而不是原始类型。例如。可以检索 null
.
像 Integer
、Long
... 这样的数字包装器是大约 -128; +127
之间的缓存值。所有其他值将在内存中复制。此外,存储 Long
比存储 long
.
多占用 3 倍 space
一般情况下我遵循以下规则。
如果你不需要 return null
你应该更喜欢 return 原始值而不是数字包装器。
上下文
我正在查看几个 Java Redis 客户端,例如 Lettuce 和 Jedis。我看到两个库都将它们的方法定义为 return 盒装原始类型而不是直接原始类型。
例如,sadd()
returns 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
问题
return装箱基元的原因可能是什么?
据我了解,装箱会增加性能开销。
对于我使用 Redis 库的库来说,保留 return 值并将其传播给库的用户有意义吗?
编辑:None 方法 return null
,因此将特殊含义编码为 null 不适用于它们。
盒装基元可以在集合中使用,而常规基元不能(尽管它们仍然可以添加到相应盒装类型的集合中),并且还允许您使用引用而不是值,这样可以节省时间和 space 在某些情况下(即当引用的大小小于数据的大小时)。但是正如您所说,盒装基元会产生内存成本和性能开销。
在我看来,主要原因是能够检索 Object
而不是原始类型。例如。可以检索 null
.
像 Integer
、Long
... 这样的数字包装器是大约 -128; +127
之间的缓存值。所有其他值将在内存中复制。此外,存储 Long
比存储 long
.
一般情况下我遵循以下规则。
如果你不需要 return null
你应该更喜欢 return 原始值而不是数字包装器。