java - 为什么 Primitives 的包装类没有 setter?

标签 java wrapper setter primitive-types immutability

Wrapper 类(如 Integer、Double 等)的内部原始值没有 setter 的原因是什么?

我问这个是因为那种功能会简化微积分,并使 Java 语言更灵活一些。

让我举几个例子。

1) 让我们来看下面的例子:

Integer x = new Integer(5);
x++;

前面的幕后代码正在执行自动装箱。像这样的东西:

int x_tmp = x.intValue();
x_tmp++;
x = new Integer(x_tmp); // Yes that's a new memory allocation

由于这个问题,在 Wrapper 上执行微积分比在普通原始类型上执行要慢。使用 setter 可以更容易地增加内部值,而无需在堆上分配另一个对象。

2) 另一个困扰我的问题是,在 Java 中不可能像在 C(使用指针)或 C++(指针或引用)中那样编写交换函数。

如果我写 void swap(Integer x, Integer y) 我无法访问内部值,因为我不可能交换这些值。

附言: 我的一个 friend 建议我应该考虑更大的图景,并从并发性和类型不变性的角度来思考。

那么你对此有解释吗? 谢谢!

最佳答案

通常不使用包装类,除非您需要将它们放入集合中。如果它们是可变的,那么在集合内部使用和作为哈希表的键时就会出现问题。

集合和哈希表需要哈希值始终相同。

关于java - 为什么 Primitives 的包装类没有 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3298596/

相关文章:

java - Log4J RollingFileAppender 不强制执行最大日志大小

java - 为什么 Class.class.getResourceAsStream(String) 总是返回 null?

Java Applet 包装器规模输出

ruby - 是否可以让 class.property = x 返回 x 以外的东西?

spring - 注入(inject) int 属性时出现 NumberFormatException

class_eval 的 Ruby 问题

java - 是否可以生成 64 字节(256 位) key 并使用 AndroidKeyStore 存储/检索它?

java - 比较 Java 中相互引用的对象

c++ - 使用自定义 std::ostream 包装 FILE*

c# - 线程安全的 SortedDictionary