标签: immutability

"new String()"也是不可变的吗?

我一直在研究Java String.以下问题基于以下帖子

Java String是java中特殊
的String不可变性

  1. 不可变性:现在,通过不变性,String类被设计为公共池中的值可以在其他位置/变量中重用.如果String被创建为, 则这很好

    String a = "Hello World!"; 但是,如果我创建String之类的

    String b = new String("Hello World!"); 为什么这也是不变的?(或者是吗?).由于这有一个专用的堆内存,我应该能够修改它而不影响任何其他变量.因此,通过设计,还有其他任何原因,为什么String整体被认为是不可改变的?或者我的上述假设是错误的?

  2. 我想问的第二件事是关于常见的字符串池.如果我创建一个字符串对象为

    String c = ""; 是在池中创建的空条目?

这些帖子上已经有帖子吗?如果是这样,有人可以分享链接吗?

java string immutability

73
推荐指数
8
解决办法
8921
查看次数

是否(或将)C#包含副作用验证功能?

我知道C#获得了很多并行编程支持,但是AFAIK仍然没有副作用验证的构造,对吧?

我认为现在C#已经布局了,现在更棘手了.但是有计划将其纳入其中吗?或者F#是唯一具有副作用验证结构的.NET语言吗?

.net c# parallel-processing f# immutability

72
推荐指数
3
解决办法
1万
查看次数

将mutable转换为不可变映射

private[this]object MMMap extends  HashMap[A, Set[B]] with MultiMap[A, B]
Run Code Online (Sandbox Code Playgroud)

如何将其转换为不可变?

scala mutable immutability scala-collections

71
推荐指数
4
解决办法
5万
查看次数

Elixir变量真的是不可变的吗?

在Dave Thomas的书"编程Elixir"中,他指出"Elixir强制执行不可变数据"并继续说:

在Elixir中,一旦变量引用了诸如[1,2,3]之类的列表,您就会知道它将始终引用那些相同的值(直到您重新绑定变量).

这听起来像"除非你改变它,否则它不会改变"所以我对可变性和重新绑定之间的区别感到困惑.突出差异的一个例子非常有用.

immutability elixir

68
推荐指数
4
解决办法
9957
查看次数

在.NET中使用System.String.Copy有什么用?

我担心这是一个非常愚蠢的问题,但我必须遗漏一些东西.

为什么可能要使用String.Copy(string)

文档说明了这种方法

使用与指定String相同的值创建String的新实例.

由于字符串在.NET中是不可变的,我不确定使用此方法的好处是什么,正如我所想的那样

 string copy = String.Copy(otherString);
Run Code Online (Sandbox Code Playgroud)

出于所有实际目的,似乎会产生与之相同的结果

 string copy = otherString;
Run Code Online (Sandbox Code Playgroud)

也就是说,除了正在进行的任何内部簿记,以及副本不是ReferenceEqualsotherString 的事实,没有可观察到的差异 - 字符串是一个不可变的类,其相等性基于值,而不是身份.(感谢@Andrew Hare指出我的原始措辞不够精确,表明我意识到Copying和not 之间存在差异,但是担心缺乏有用的差异.)

当然,当传递null参数时,Copy会抛出一个ArgumentNullException,而"new instance"可能会占用更多内存.后者几乎不是一个好处,我不确定无效检查是一个足够大的奖金来保证整个复制方法.

谢谢.

.net string copy immutability

63
推荐指数
6
解决办法
1万
查看次数

不可变的numpy数组?

有没有一种简单的方法来创建不可变的NumPy数组?

如果必须从中派生出一个类ndarray,那么为了实现不变性,必须覆盖的最小方法集是什么?

python arrays numpy readonly immutability

63
推荐指数
1
解决办法
2万
查看次数

制作不可变的Java对象

我的目标是使Java对象不可变.我上课了Student.我用以下方式对其进行编码以实现不变性:

public final class Student {

private String name;
private String age;

public Student(String name, String age) {
    this.name = name;
    this.age = age;
}

public String getName() {
    return name;
}

public String getAge() {
    return age;
}

}
Run Code Online (Sandbox Code Playgroud)

我的问题是,实现Student课堂不变性的最佳方法是什么?

java immutability

63
推荐指数
3
解决办法
6万
查看次数

是否可以公开Immutable对象的状态?

最近遇到了不可变对象的概念,我想知道控制状态访问的最佳实践.即使我的大脑的面向对象部分让我想要在公众成员的视线中畏缩,但我认为没有类似这样的技术问题:

public class Foo {
    public final int x;
    public final int y;

    public Foo( int x, int y) {
        this.x = x;
        this.y = y;
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得更适合声明字段private并为每个字段提供getter方法,但是当状态明确只读时,这似乎过于复杂.

提供对不可变对象状态的访问的最佳实践是什么?

java immutability value-objects

63
推荐指数
5
解决办法
4000
查看次数

在C#中,为什么我不能在foreach循环中修改值类型实例的成员?

我知道值类型应该是不可变的,但这只是一个建议,而不是一个规则,对吧?那么为什么我不能做这样的事情:

struct MyStruct
{
    public string Name { get; set; }
}

 public class Program
{
    static void Main(string[] args)
    {
        MyStruct[] array = new MyStruct[] { new MyStruct { Name = "1" }, new MyStruct { Name = "2" } };
        foreach (var item in array)
        {
            item.Name = "3";
        }
        //for (int i = 0; i < array.Length; i++)
        //{
        //    array[i].Name = "3";
        //}

        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

代码中的foreach循环不会编译,而注释for循环工作正常.错误消息:

无法修改'item'的成员,因为它是'foreach迭代变量'

这是为什么?

c# foreach immutability value-type

62
推荐指数
3
解决办法
3万
查看次数

不可变字符串vs std :: string

我最近一直在阅读有关不可变字符串的原因为什么字符串在Java和.NET中不可变为什么.NET字符串是不可改变的?以及为什么D选择不可变字符串的一些东西.似乎有很多好处.

  • 平凡的线程安全
  • 更安全
  • 在大多数用例中,内存效率更高.
  • 便宜的子串(标记化和切片)

更不用说大多数新语言都有不可变的字符串,D2.0,Java,C#,Python等.

C++会从不可变字符串中受益吗?

是否有可能在c ++(或c ++ 0x)中实现具有所有这些优点的不可变字符串类?


更新:

在不可变字符串const_stringfix_str上有两次尝试.五年内都没有更新.它们甚至被使用过吗?为什么const_string没有进入boost?

c++ string immutability

61
推荐指数
3
解决办法
3万
查看次数