草庐IT

immutability

全部标签

python - Python 有一个不可变的列表吗?

python有不可变的列表吗?假设我希望有一个有序的元素集合的功能,但我想保证不会改变,如何实现?列表是有序的,但它们可以改变。 最佳答案 是的。它被称为tuple。所以,[1,2]是一个list并且可以被变异,而不是(1,2)是一个tuple不能。更多信息:单元素的tuple不能通过写(1)来实例化,而是需要写(1,)。这是因为解释器对括号还有各种其他用途。您也可以完全取消括号:1,2与(1,2)相同请注意,元组完全不是不可变列表。单击此处阅读有关differencesbetweenlistsandtuples的更多信息

java - 具有 ArrayList 成员变量的不可变对象(immutable对象) - 为什么可以更改此变量?

我有一个包含各种成员变量的类。有一个构造函数,有getter方法,但没有setter方法。事实上,这个对象应该是不可变的。publicclassExample{privateArrayListlist;}现在我注意到以下情况:当我使用getter方法获取变量列表时,我可以添加新值等等-我可以更改ArrayList。当我下次为此变量调用get()时,将返回更改后的ArrayList。怎么会这样?我没有再设置它,我只是在努力!使用String这种行为是不可能的。那么这里有什么区别呢? 最佳答案 仅仅因为对列表的引用是不可变的并不意味着它

java - 具有 ArrayList 成员变量的不可变对象(immutable对象) - 为什么可以更改此变量?

我有一个包含各种成员变量的类。有一个构造函数,有getter方法,但没有setter方法。事实上,这个对象应该是不可变的。publicclassExample{privateArrayListlist;}现在我注意到以下情况:当我使用getter方法获取变量列表时,我可以添加新值等等-我可以更改ArrayList。当我下次为此变量调用get()时,将返回更改后的ArrayList。怎么会这样?我没有再设置它,我只是在努力!使用String这种行为是不可能的。那么这里有什么区别呢? 最佳答案 仅仅因为对列表的引用是不可变的并不意味着它

java - 如何避免制作 ByteBuffer 的防御性副本?

我有一个将ByteBuffer作为构造函数参数的类。有没有办法避免制作防御性副本以确保缓冲区在此之后不会被修改?ByteBuffer.isReadOnly()不保证原始所有者不会修改缓冲区。更糟糕的是,似乎没有办法将ByteBuffer子类化。有什么想法吗? 最佳答案 正如您所说,唯一真正的方法是buf.asReadOnlyBuffer(),然后将其传递给构造函数。除了这个之外没有其他选择,尽管您可以将内容复制到一个新的ByteBuffer中,然后传递它。 关于java-如何避免制作By

java - 如何避免制作 ByteBuffer 的防御性副本?

我有一个将ByteBuffer作为构造函数参数的类。有没有办法避免制作防御性副本以确保缓冲区在此之后不会被修改?ByteBuffer.isReadOnly()不保证原始所有者不会修改缓冲区。更糟糕的是,似乎没有办法将ByteBuffer子类化。有什么想法吗? 最佳答案 正如您所说,唯一真正的方法是buf.asReadOnlyBuffer(),然后将其传递给构造函数。除了这个之外没有其他选择,尽管您可以将内容复制到一个新的ByteBuffer中,然后传递它。 关于java-如何避免制作By

java - 如何使用 LinkedList 作为实例字段来管理不可变类?

我有一个名为Employees的不可变类,如下所示:publicfinalclassEmployees{privatefinalListpersons;publicEmployees(){persons=newLinkedList();}publicListgetPersons(){returnpersons;}}如何保持这个类不可变?我将字段private和final设为了,我没有提供setter方法。这足以实现不变性吗? 最佳答案 答案已编辑,不仅解释了可变版本Person的情况,还解释了不可变版本Person的情况。你的类是可

java - 如何使用 LinkedList 作为实例字段来管理不可变类?

我有一个名为Employees的不可变类,如下所示:publicfinalclassEmployees{privatefinalListpersons;publicEmployees(){persons=newLinkedList();}publicListgetPersons(){returnpersons;}}如何保持这个类不可变?我将字段private和final设为了,我没有提供setter方法。这足以实现不变性吗? 最佳答案 答案已编辑,不仅解释了可变版本Person的情况,还解释了不可变版本Person的情况。你的类是可

java - 可变对象和 hashCode

有以下类:publicclassMember{privateintx;privatelongy;privatedoubled;publicMember(intx,longy,doubled){this.x=x;this.y=y;this.d=d;}@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+x;result=(int)(prime*result+y);result=(int)(prime*result+Double.doubleToLongBits(d));returnres

java - 可变对象和 hashCode

有以下类:publicclassMember{privateintx;privatelongy;privatedoubled;publicMember(intx,longy,doubled){this.x=x;this.y=y;this.d=d;}@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+x;result=(int)(prime*result+y);result=(int)(prime*result+Double.doubleToLongBits(d));returnres

java - 不可变对象(immutable对象)是线程安全的,但为什么呢?

例如,一个线程通过创建它的对象来创建和填充不可变类的引用变量,另一个线程在第一个线程完成之前启动并创建不可变类的另一个对象,不可变类不会使用是线程不安全的吗?创建不可变对象(immutable对象)也意味着所有字段都必须标记为final。itmaybenecessarytoensurecorrectbehaviorifareferencetoanewlycreatedinstanceispassedfromonethreadtoanotherwithoutsynchronization他们是否想说其他线程可能会将引用变量重新指向不可变类的其他对象,这样线程将指向不同的对象而导致状态不一