草庐IT

Immutability

全部标签

php - 拦截对定义的 PHP 方法的调用

我正在尝试创建一个Trait来制作“可卡住值对象”。(避免位置参数和伸缩构造函数。)这意味着可以使用setter来初始化对象,然后调用->freeze(),使对象“不可变”。setter仍会存在,但调用时会抛出异常。这可以通过在每个setter的开头调用$this->assertIsWritable();来实现。但是我想避免这种情况(因为很容易忘记这样的电话)并自动进行此检查。有没有办法拦截对已定义方法的调用?在解决方案中NotAcceptable:破坏类型提示和/或静态代码分析的方法对特殊PHP扩展的依赖我正在使用PHP7.0。 最佳答案

java - 为什么不可变对象(immutable对象)在双重检查锁定中是安全的?

在http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html的底部,它说:Double-CheckedLockingImmutableObjectsIfHelperisanimmutableobject,suchthatallofthefieldsofHelperarefinal,thendouble-checkedlockingwillworkwithouthavingtousevolatilefields.Theideaisthatareferencetoanimmutableobject(sucha

java - 确保类是不可变的

在this6岁的问题最高答案说无法验证不变性。另一方面,底部有两个最近的答案,表明可以使用:jcabimutabilitydetector检测类是否不可变。我的问题是:这些工具在现实生活中有用吗?还有其他(更好的)解决方案吗?这几年有什么变化吗? 最佳答案 虽然我确信有很多工具可以直接测试一个类是否是不可变的,但真正的问题是测试允许具有接口(interface)或抽象类声明的字段的不可变类。基本上只允许密封的不可变类作为子字段,因为继承通常会破坏不变性。如果不使用JavaCollectionsAPI(即不使用Map、List或Set

java - 包装到另一个类中的不可变整数(按值调用)

我想知道在Java中按值调用并尝试了一些代码。publicclassTest{publicstaticvoidmain(String[]args){Testtest=newTest();Integerinteger=4;System.out.println(integer);test.change(integer);System.out.println(integer);}publicvoidchange(Integerinteger){integer++;}}因为java是按值调用的,所以我在徘徊输出:45但是打印出来了44然后我了解到整数是不可变的,所以我的方法“更改”创建了值为5

java - 可变对象的安全发布

我阅读了几个相关问题,但没有一个解释安全发布持有人的方式。我仍然对Java并发实践中的示例感到困惑,第3.5节:有类Holder:publicHolder{privateintn;publicHolder(intn){this.n=n};publicvoidassertSanity(){if(n!=n)thrownewAssertionError("Thisstatementisfalse.");}}及其不安全的出版物://unsafepublicationpublicHolderholder;publicvoidinitialize(){holder=newHolder(42);}可

java - 静态初始化的 unmodifiableCollection.get 是否保证不可变?

静态初始化的unmodifiableCollection.get是否保证不可变?对于:静态最终mapFOO=Collections.unmodifiableMap(newHashMap());多线程使用get方法能不出问题吗?即使无法添加/删除FOO中的项目,是什么阻止了get方法出于缓存目的操纵FOO的内部状态等。如果以任何方式修改内部状态,则FOO不能同时使用。如果是这样,java中真正的不可变集合在哪里? 最佳答案 给出具体的例子:staticfinalMapFOO=Collections.unmodifiableMap(ne

java - 使用修饰符创建不可变类的好方法(线程安全)

我有一个案例,当我想避免防御性副本时,对于可能仍然被修改但通常只是读取而不是写入的数据。所以,我想使用不可变对象(immutable对象),使用函数式修改器方法,这很常见(javalombok能够或多或少地自动完成)。我的处理方式如下:publicclassPerson{privateStringname,surname;publicPerson(Stringname,Stringsurname){....}//getters...//andinsteadofsetterspublicPersonwithName(Stringname){Personp=copy();//createa

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....;}这样一来,没人会搬起石头砸自己的