草庐IT

immutability

全部标签

java - 不可变类型需要复制构造函数吗?

假设我有一个不可变的DecimalNumber类:publicfinalclassDecimalNumber{publicfinalStringstr;publicDecimalNumber(Stringstr){this.str=str;}publicDecimalNumber(DecimalNumbercopy){this(copy.str);}publicbooleanisZero(){...}publicDecimalNumberadd(DecimalNumberother){...}...}我决定像这样实现add:publicDecimalNumberadd(DecimalN

java - 如何将 Hibernate 映射集加载为不可修改的集?

我正在开发的一个应用程序专门使用Hibernate从数据库中获取一堆持久对象到内存中。应用程序会时不时地从数据库中刷新这个内存中的快照,这应该是与数据库的唯一通信。然后将内存中的对象用于一系列计算。计算不得修改这些对象。除了某个地方的某个类(class)不小心做了,我不得不花一天时间来寻找这个错误。现在我想知道使整个对象树不可变的最佳方法是什么。假设类层次结构如下所示:publicclassBuilding{//persistententityprivateStringname;//hibernate-mappedpropertyprivateSetinhabitants;//hibe

java - 一种将可变数据结构声明为输出并实际返回不可变数据结构的方法

最近,我对这个问题进行了热烈的讨论。假设我在Java中创建了这个方法:publicSetgetRich(){returnImmutableSet....;}每当我在拉取请求中看到这一点时,我都会大喊并试图解释为什么它是错误的。通过这样做,我通过promise他们将获得Set误导了我的方法的消费者。这意味着他们可以删除或添加元素。javac会愉快地编译它,但会抛出RuntimeException。此外,它违反了“里氏替换原则”。就个人而言,我总是这样做:publicImmutableSetgetRich(){returnImmutableSet....;}这样一来,没人会搬起石头砸自己的

java - Java 字符串并非真正不可变的含义是什么?

背景在Java101中,我们被教导:AStringisimmutable.是的。好的。谢谢。然后我们进入Java102(或者Java201),我们发现:AStringisn'treallyimmutable:youcanchangeitusingreflection.啊。美好的。要么很可爱,要么非常反常,这取决于你的观点。到目前为止,这些东西已经discussedadinfinitum在StackOverflow和其他地方。在提出这个问题时,我认为这是理所当然的。我有兴趣问的是:问题OncewediscoverthataStringisn'treallyimmutable,whatar

java - 依赖注入(inject)、初始化后的不变性

我希望能够指定一个对象的成员变量在对象被“初始化”后是不可变的,这对我来说意味着在它被注入(inject)任何依赖项之后,并且已经执行了它所需要的任何其他初始化操作只能在DI之后执行。是否有满足我兴趣的语言-以这种方式形式化DI、初始化并支持不变性?使它们成为语言的一部分也许是愚蠢的;也许不吧。我不确定。今天我用Java编程,但我不能像我想的那样经常使用“final”,因为这些阶段发生在构造函数完成执行之后。关于如何使用Java获得我想要的东西的任何建议?我想我可以让我的对象实现一个基类,以便这些阶段在构造函数完成之前发生,或者使用方面来做同样的事情。想法?

java - 进程内缓存 vs 分布式缓存与可变/不可变对象(immutable对象)的一致性

我听我的同事说,在缓存immutable对象时,进程内缓存是更好的选择,因为一致性不是大问题(最终一致性)。而外部分布式缓存更适合您始终希望读取保持一致(强)的可变对象。这总是事实吗?我真的不明白可变性与一致性有何关系。有人可以帮助我理解这一点吗? 最佳答案 当您使用分布式缓存时,每个对象都在多个独立机器、多个缓存节点之间复制。如果您的对象是不可变的,复制就不是问题:因为对象永远不会改变,所以任何缓存实例都将提供完全相同的对象。一旦对象变得可变,就会出现一致性问题:当您向缓存实例请求对象时,您如何确定交付给您的对象是最新的?如果在一

java - 保护最终变量免受反射

我想设计一个类来逐步证明不变性。下面是一个简单的类publicclassImmutableWithoutMutator{privatefinalStringfirstName;privatefinalStringlastName;privatefinalintage;publicImmutableWithoutMutator(finalStringfirstName,finalStringlastName,finalintage){this.firstName=firstName;this.lastName=lastName;this.age=age;}@OverridepublicS

Java 不可变对象(immutable对象)

关闭。这个问题需要更多focused.Itisnotcurrentlyacceptinganswers.想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.Closed8yearsago.ImprovethisquestionIamlearningtheconceptofimmutability.Iunderstandthatimmutableobjectscannotchangetheirvaluesoncetheobjectiscreated.ButIdidn'tunderstandthefollowingusesofimmutableobjects.Th

java - java.lang.String 的哈希码真的被缓存了吗?

Strings1="String1";System.out.println(s1.hashCode());//returnanintegeri1Fieldfield=String.class.getDeclaredField("value");field.setAccessible(true);char[]value=(char[])field.get(s1);value[0]='J';value[1]='a';value[2]='v';value[3]='a';value[4]='1';System.out.println(s1.hashCode());//returnsameval

c# - 您期望不可变列表的不可变性有多深?

如果你有一个不可变列表,你希望它总是在你请求时返回对同一对象的引用,比如说list.get(0)我的问题是,您是否希望能够改变该对象并在下次从列表中获取它时反射(reflect)该改变? 最佳答案 这取决于上下文。在通用库中,我们应该假设list是不可变的。对列表中元素的更改将反射(reflect)给所有调用者,这是每次返回相同引用的直接结果。但是,如果这是一个专门的不可变树(或其他),并且被如此记录,那么您会期望列表中的项目本身是不可变的,这将成为一个有实际意义的问题。 关于c#-您期