【问题标题】:Are there immutable objects besides Strings in Java?Java中除了字符串之外还有不可变的对象吗?
【发布时间】:2013-03-13 01:40:56
【问题描述】:

我只听说Java中的字符串不能是不可变的,我想知道除了字符串之外还有其他对象也是不可变的吗?

顺便说一句,C++ 中的字符串也是不可变的吗?

【问题讨论】:

  • 是的,Java 中有很多不可变对象。我将把它作为练习留给读者寻找并创建一些。不,C++ 字符串不是不可变的。它们只是字符数组。
  • 嗨气垫船。哇,我很惊讶还有其他不可变的对象。好的,我会找到一些或创建一些作为学习练习。
  • 没什么好惊讶的。有这么多这些是有充分理由的,而您真正应该做的是找出为什么不可变对象如此吸引人,它们究竟有什么好处。
  • 我确实找到了一个原因:安全

标签: java c++ string object immutability


【解决方案1】:

许多基本类型是不可变的(Integer、Long、Boolean 等)。不变性不是在 java 中明确指出的东西,它实际上是一种语义契约。您可以通过将其成员声明为 final、在构造时分配它们并通过类的公共接口锁定访问来使任何类不可变。

C++ 中的字符串是以零字符结尾的字符数组。就是这样。尽管使用 const 可以帮助锁定访问权限,但这并没有保证不变性。

我想重点是 Java 中的很多东西都是不可变的,但只有文档和源代码才能真正向你证明这一点。

【讨论】:

  • "string" 是 C++ 中的一个概念,有很多实现。以空字符结尾的字符串是以零字符结尾的字符数组。还有std::stringstd::wstringCString_bstr_tQString、5种字符串字面量、string_ref...
  • 重点,我的 C++ 知识是我大学时代的遗留物。
  • 但是你可以改变原语的值,如果你给它一个新的值,不是吗?我看不出原语是如何不可变的。
  • @user983246 这不会改变原语的值。这些是引用类型,所以如果你有 Integer a = Integer.valueOf(1);然后,a = Integer.valueOf(2) - a 现在指的是 Integer 类的不同的、不可变的实例。作为一个更好的例子,假设你调用了 someInstance.setFoo(a);然后 a = Integer.valueOf(10); - someInstance 仍将具有原始值“a”,而不是 10。您看到区别了吗?
  • 哦,那有两个不同的对象!
【解决方案2】:

所有装箱的基元,例如 Integer,都是不可变的。

您可以自己创建不可变类 - 例如,使用其构造函数设置其变量的类,并且没有公共变量或设置器。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多