标签: immutability

如何设计具有复杂初始化的不可变对象

我正在学习DDD,并且遇到了"值 - 对象"应该是不可变的声明.我知道这意味着对象状态在创建后不应该更改.这对我来说是一种新的思维方式,但在许多情况下它是有道理的.

好的,所以我开始创建不可变的值对象.

  • 我确保他们将整个状态作为构造函数的参数,
  • 我没有添加属性设置器,
  • 并确保不允许任何方法修改内容(仅返回新实例).

但是现在我想创建这个包含8个不同数值的值对象.如果我创建一个具有8个数字参数的构造函数,我觉得它不会很容易使用,或者更确切地说 - 传递数字时很容易出错.这不是一个好的设计.

所以问题是:是否还有其他方法可以使我的不可变对象变得更好..,在C#中可以用来克服构造函数中的长参数列表的任何魔法?我很想听听你的想法..

更新:在任何人提到它之前,这里讨论了一个想法: C#中的不可变对象模式 - 你怎么看?

有兴趣听取其他建议或意见.

c# domain-driven-design immutability

13
推荐指数
2
解决办法
5378
查看次数

Python,子类化不可变类型

我有以下课程:

class MySet(set):

    def __init__(self, arg=None):
        if isinstance(arg, basestring):
            arg = arg.split()
        set.__init__(self, arg)
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作(用字符串而不是字母初始化集合).但是,当我想对set的不可变版本执行相同操作时,该__init__方法似乎被忽略:

class MySet(frozenset):

    def __init__(self, arg=None):
        if isinstance(arg, basestring):
            arg = arg.split()
        frozenset.__init__(self, arg)
Run Code Online (Sandbox Code Playgroud)

我可以实现类似的东西__new__吗?

python set immutability

13
推荐指数
1
解决办法
2528
查看次数

枚举与不可变在D中

有什么区别

enum i = 2;
enum s = "Hello";
Run Code Online (Sandbox Code Playgroud)

immutable i = 2;
immutable s = "Hello";
Run Code Online (Sandbox Code Playgroud)

在D 2.0?

enums d immutability

13
推荐指数
2
解决办法
1205
查看次数

为什么Scala的"列表"被实现为链表

我一直认为链表的好处是你可以添加或删除项目(特别是不是从最后),而不必复制很多元素,这要归功于指针之美.

但是,Scala List是不可变的(至少在默认情况下是这样).拥有不可变链表是有什么好处的(因为有明确的缺点,例如不是O(1)元素访问.)

谢谢!

scala linked-list list immutability

13
推荐指数
4
解决办法
3842
查看次数

为什么Scala集合中没有不可变的双链表?

看看这个问题,提问者对a中某个元素的第一个和最后一个实例感兴趣List,似乎更有效的解决方案是使用DoubleLinkedList可以从列表末尾向后搜索的问题.但是,集合API中只有一个实现,它是可变的.

为什么没有不可变版本?

collections scala linked-list immutability

13
推荐指数
3
解决办法
3367
查看次数

有效地"修改"ImmutableMap

我们目前正在使用Guava作为其不可变的集合,但我很惊讶地发现他们的地图没有方法可以轻松创建新的地图并进行微小的修改.最重要的是,他们的构建器不允许为键分配新值或删除键.

因此,如果我只想修改一个值,这就是我希望能够做到的:

ImmutableMap<Guid, ImmutableMap<String, Integer>> originalMap = /* get the map */;
ImmutableMap<Guid, ImmutableMap<String, Integer>> modifiedMap =
    originalMap.cloneAndPut(key, value);
Run Code Online (Sandbox Code Playgroud)

这就是Guava期待我做的事情:

ImmutableMap<Guid, ImmutableMap<String, Integer>> originalMap = /* get the map */;
Map<Guid, ImmutableMap<String, Integer>> mutableCopy = new LinkedHashMap<>(originalMap);
mutableCopy.put(key, value);
originalMap = ImmutableMap.copyOf(mutableCopy);
/* put the map back */
Run Code Online (Sandbox Code Playgroud)

通过这样做,我得到了我想要的修改的地图的新副本.原始副本不受影响,我将使用原子引用将事物放回去,因此整个设置是线程安全的.

这很慢.

这里有很多浪费的复制品.假设地图中有1,024个桶.当你可以按原样使用那些不可变的桶并且只克隆其中一个时,那就是你不必要地重新创建的1,023个桶(也是每个两次).

所以我想:

  1. 是否有一种Guava实用方法埋在某处用于此类事情?(它不在地图或ImmutableMap.Builder中.)

  2. 有没有其他Java库可以做到这一点?我的印象是Clojure有这样的东西但我们还没准备好转换语言......

java map immutability guava

13
推荐指数
1
解决办法
6952
查看次数

当两者都是引用类型时,字符串与类

这是我上一次采访的方式:

问题:字符串存储在哪里?

答:堆是因为它是参考类型

问题:请解释以下代码:

static void Main(string[] args)
{
     string one = "test";
     string two = one;
     one = one + " string";

     Console.WriteLine("One is {0}" , one);
     Console.WriteLine("Two is {0}", two);
}
Run Code Online (Sandbox Code Playgroud)

答案:画了两张如下图:

(代表声明, string two = one;

在此输入图像描述

(代表语句, one = one + " string";.在堆上创建一个新字符串并分配)

在此输入图像描述

问题:正确.为下面的代码片段绘制类似的内容:

class Program
{
    static void Main(string[] args)
    {
        Test one = new Test { someString = "test" };
        Test two = one;
        one.someString = "test String";

        Console.WriteLine("One …
Run Code Online (Sandbox Code Playgroud)

.net c# string class immutability

13
推荐指数
1
解决办法
307
查看次数

在Haskell中列出操作性能

我目前正在学习Haskell,我很好奇以下内容:

如果我在Haskell中向一个列表中添加一个元素,Haskell会返回一个(完全?)新列表,并且不会操纵原始列表.

现在假设我有一个包含一百万个元素的列表,并在最后添加一个元素.Haskell"复制"整个列表(100万个元素)并将元素添加到该副本中吗?或者是否有一个整洁的"技巧"在幕后进行,以避免复制整个列表?

如果没有"技巧",复制大型列表的过程是不是像我想的那样昂贵?

haskell list append immutability data-structures

13
推荐指数
2
解决办法
2122
查看次数

如何复制结构并同时修改其中一个属性?

如果我想将我的视图控制器的状态表示为单个结构然后实现撤销机制,那么我如何更改结构上的一个属性,同时获取前一个状态的副本?

struct A {
   let a: Int
   let b: Int

   init(a: Int = 2, b: Int = 3) {
      self.a = a
      self.b = b
   }
}

let state = A()
Run Code Online (Sandbox Code Playgroud)

现在我想要一份state但是b = 4 的副本.如何在不构造新对象且必须为每个属性指定值的情况下执行此操作?

immutability swift

13
推荐指数
3
解决办法
7510
查看次数

var str:String是可变的还是不可变的?

我在Kotlin中声明了一个String变量.

var str: String

Kotlin文件与可变性概念相矛盾.根据文件... var是可变的. var是可变的

但对于String,它定义为不可变的. 字符串是不可变的

所以请澄清矛盾......

string android immutability kotlin

13
推荐指数
2
解决办法
1596
查看次数