Tag: 不变性

C#,不变性和公共只读字段

我曾经在很多地方看过,公开地公开这些内容并不是一个好主意,因为如果你以后想改变属性,你将不得不重新编译所有使用你的类的代码。 但是,在不可变类的情况下,我不明白为什么你需要改变属性 – 毕竟你不会为逻辑添加逻辑。 任何想法,我错过了什么? 差别的例子,对于那些比文本更容易阅读代码的人:) //Immutable Tuple using public readonly fields public class Tuple<T1,T2> { public readonly T1 Item1; public readonly T2 Item2; public Tuple(T1 item1, T2 item2) { Item1 = item1; Item2 = item2; } } //Immutable Tuple using public properties and private readonly fields public class Tuple<T1,T2> { private readonly T1 _Item1; […]

为什么微软build议针对可变值的只读字段?

微软在“开发类库的devise指南”中说: 不要将可变types的实例分配给只读字段。 使用可变types创build的对象可以在创build后进行修改。 例如,数组和大多数集合是可变types,而Int32,Uri和String是不可变types。 对于包含可变引用types的字段,只读修饰符可以防止字段值被覆盖,但不保护可变types不被修改。 这只是简单地重申只读行为,而不解释为什么使用只读。 其含义似乎是,许多人不明白“只读”是什么,并错误地认为只读字段是不可变的。 实际上,build议使用“readonly”作为代码文档,指示深度不变性 – 尽pipe编译器无法强制执行此操作 – 并且不允许将其用于其正常function:确保字段的值不会在更改后该对象已被构build。 我对这个build议感到不自在,只能用“只读”来表示一些不同于编译器所理解的正常含义的东西。 我觉得它鼓励人们误解“只读”的意思,而且期望它意味着代码作者可能不想要的东西。 我觉得它排除了在可能有用的地方使用它 – 例如,为了显示两个可变对象之间的某些关系在其中一个对象的生命周期中保持不变。 假定读者不理解“只读”的含义的概念似乎也与微软的其他build议相矛盾,例如FxCop的“不要初始化不必要的”规则,该规则假设读者的代码是语言的专家并且应该知道(例如)bool字段会自动初始化为false,并阻止您提供显示为“是的,这已被有意识地设置为false;我不只是忘记初始化”的冗余。 所以,首先, 为什么微软build议不要使用readonly来引用可变types? 我也有兴趣知道: 你在所有的代码中遵循这个devise指南吗? 当你在一段你没有写的代码中看到“只读”时,你期望什么?

为什么Pythonstring是不可变的? 使用它们的最佳实践

什么是使Pythonstring不可变的devise原因? 它如何使编程更容易? 我习惯了可变string,就像C中的那些字符一样。我应该如何编程而不使用可变string? 有没有最佳做法?

不可变的数据结构性能

我不明白如何能够作为一个集合是不可改变的,仍然有一个可以接受的性能。 从我读过的F#集内部使用红黑树作为他们的实现。 如果每次我们要为红黑树添加新的东西,我们必须基本上重新创build它,怎么会有好的performance? 我在这里错过了什么? 虽然我问这个F#的集合,我认为这是任何其他语言具有或使用不变的数据结构相关。 谢谢

.clone()或Arrays.copyOf()?

为了减less可变性,我们应该使用 public void setValues(String[] newVals) { this.vals = ( newVals == null ? null : newVals.clone() ); } 要么 public void setValues(String[] newVals) { this.vals = ( newVals == null ? null : Arrays.copyOf(newVals, newVals.length) ); }

保留插入顺序的不可变的Scala Map实现

LinkedHashMap用于在地图中保留插入顺序,但是这只适用于可变映射。 哪个是保留插入顺序的不可变Map实现?

基于以前的值更新地图中的值的习惯方法

比方说,我将银行账户信息存储在一个不可变的Map : val m = Map("Mark" -> 100, "Jonathan" -> 350, "Bob" -> 65) 我想从马克的账户里拿出50美元。 我可以这样做: val m2 = m + ("Mark" -> (m("Mark") – 50)) 但是这个代码对我来说似乎很难看。 有没有更好的方法来写这个?

Scala类的构造函数参数

有什么区别: class Person(name: String, age: Int) { def say = "My name is " + name + ", age " + age } 和 class Person(val name: String, val age: Int) { def say = "My name is " + name + ", age " + age } 我可以将参数声明为var s,稍后更改它们的值吗? 例如, class Person(var name: String, […]

如何从Java中的特定string中删除特定字符?

例如,我从文本文件中提取文本string,我需要这些字形成一个数组。 但是,当我用逗号(,)或句号(。)结尾,或者甚至附上括号(这完全正常)的时候。 我想要做的就是摆脱这些angular色。 我一直在使用Java中那些预定义的String方法来做到这一点,但我无法绕过它。

如何在Java中识别不可变对象

在我的代码中,我创build了一个对象的集合,这些对象将以各种线程访问,只有当对象是不可变的时候才是安全的。 当试图插入一个新的对象到我的集合,我想testing,看看它是不可变的(如果没有,我会抛出一个exception)。 我可以做的一件事是检查一些众所周知的不可变types: private static final Set<Class> knownImmutables = new HashSet<Class>(Arrays.asList( String.class, Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Boolean.class, BigInteger.class, BigDecimal.class )); … public static boolean isImmutable(Object o) { return knownImmutables.contains(o.getClass()); } 这实际上让我有90%的方式,但有时我的用户会想要创build自己的简单的不可变types: public class ImmutableRectangle { private final int width; private final int height; public ImmutableRectangle(int width, int height) { this.width = width; this.height […]