我正在学习DDD,并且遇到了"值 - 对象"应该是不可变的声明.我知道这意味着对象状态在创建后不应该更改.这对我来说是一种新的思维方式,但在许多情况下它是有道理的.
好的,所以我开始创建不可变的值对象.
但是现在我想创建这个包含8个不同数值的值对象.如果我创建一个具有8个数字参数的构造函数,我觉得它不会很容易使用,或者更确切地说 - 传递数字时很容易出错.这不是一个好的设计.
所以问题是:是否还有其他方法可以使我的不可变对象变得更好..,在C#中可以用来克服构造函数中的长参数列表的任何魔法?我很想听听你的想法..
更新:在任何人提到它之前,这里讨论了一个想法: C#中的不可变对象模式 - 你怎么看?
有兴趣听取其他建议或意见.
我有以下课程:
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__吗?
有什么区别
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?
我一直认为链表的好处是你可以添加或删除项目(特别是不是从最后),而不必复制很多元素,这要归功于指针之美.
但是,Scala List是不可变的(至少在默认情况下是这样).拥有不可变链表是有什么好处的(因为有明确的缺点,例如不是O(1)元素访问.)
谢谢!
看看这个问题,提问者对a中某个元素的第一个和最后一个实例感兴趣List,似乎更有效的解决方案是使用DoubleLinkedList可以从列表末尾向后搜索的问题.但是,集合API中只有一个实现,它是可变的.
为什么没有不可变版本?
我们目前正在使用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个桶(也是每个两次).
所以我想:
是否有一种Guava实用方法埋在某处用于此类事情?(它不在地图或ImmutableMap.Builder中.)
有没有其他Java库可以做到这一点?我的印象是Clojure有这样的东西但我们还没准备好转换语言......
这是我上一次采访的方式:
问题:字符串存储在哪里?
答:堆是因为它是参考类型
问题:请解释以下代码:
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) 我目前正在学习Haskell,我很好奇以下内容:
如果我在Haskell中向一个列表中添加一个元素,Haskell会返回一个(完全?)新列表,并且不会操纵原始列表.
现在假设我有一个包含一百万个元素的列表,并在最后添加一个元素.Haskell"复制"整个列表(100万个元素)并将元素添加到该副本中吗?或者是否有一个整洁的"技巧"在幕后进行,以避免复制整个列表?
如果没有"技巧",复制大型列表的过程是不是像我想的那样昂贵?
如果我想将我的视图控制器的状态表示为单个结构然后实现撤销机制,那么我如何更改结构上的一个属性,同时获取前一个状态的副本?
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 的副本.如何在不构造新对象且必须为每个属性指定值的情况下执行此操作?
我在Kotlin中声明了一个String变量.
var str: String
Kotlin文件与可变性概念相矛盾.根据文件... var是可变的.

但对于String,它定义为不可变的.

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