jjzjj

immutability

全部标签

java - 是否需要 Java 枚举类型的防御副本?

应该返回私有(private)引用类型的所谓“防御副本”。这是为了避免返回私有(private)字段的引用。我想知道私有(private)枚举类型是否有必要。我在某处读到枚举是不可变的引用类型,所以答案应该是“否”。是吗? 最佳答案 枚举不是本质上不可变的——但无论如何你都无法创建防御性副本,因为只有一组固定的实例可用——你有em>返回对现有实例之一的引用,而不是创建新实例。枚举通常应该无论如何都是不可变的,但为了抵消它们本质上不可变的说法:enumBadEnum{INSTANCE;privateintfoo;privateintg

java - 如何在带有日期字段的java中使类不可变?

我创建了一个带有日期字段的不可变类。我如何确保即使日期字段也是不可变的,因为即使您将日期字段设置为final,您以后仍然可以为其分配不同的值? 最佳答案 在您的getDate()方法中,返回一个newDate()实例,而不是相同的实例。publicDategetDate(){//Notcorrect.returnthis.date;//Thiswillmakeyourclassmutable.//Insteaduse,returnnewDate(this.date.getTime());//Thiswillmakesureyourd

java - 为不可变类实现 clone()

我正在开发一个类库。我有一个矩阵的抽象基类Matrix,它提供一些基本方法的实现。从Matrix派生的是不同类型矩阵的具体子类。我要求矩阵是可克隆的,所以Matrix实现了Cloneable接口(interface)。一些从Matrix派生的类是不可变的不可变类的克隆方法不返回对象的克隆,而是返回对象本身是否可以接受?用于澄清的一些(过于简化的)代码:abstractclassMatriximplementsCloneable{...}classImmutableMatrixextendsMatrix{ImmutableMatrixclone(){returnthis;}...}cla

java - 谷歌 Collection ( Guava 图书馆): ImmutableSet/List/Map and Filtering

假设您要构建一个ImmutableSet/List/Map对象的副本,但要过滤掉一些原始条目。一种实现方法如下:ImmutableList.copyOf(Iterables.filter(myObject,myObject.EQUALS));其中myObject.EQUALS是Iterables.filter()操作的谓词。我认为这是一个非常优雅且易于阅读的实现。然而,构建两个列表对象(第一个通过Iterables.filter(...)调用,第二个通过ImmutableList.copyOf(...))是非常低效的.有人知道更有效的方法吗?我想最好的办法是向ImmutableSet/

java - 为什么将对最终类实例的引用声明为最终的?

第二行的意义:publicfinalclassA{}finalAobj1=newA();如果A已经是不可变的,为什么人们可能想要使obj1成为最终的?(只是为了让它坚持一个独特的内存引用?)。 最佳答案 第一行中的final表示该对象因扩展而关闭......即你不能继承它。第二行的final表示您不能重新分配变量。 关于java-为什么将对最终类实例的引用声明为最终的?,我们在StackOverflow上找到一个类似的问题: https://stackover

java - 实现线程安全共享计数器的功能方法

我是Scala和函数式编程的新手,我喜欢使用不可变对象(immutable对象)可以避免许多线程安全陷阱的想法。一件事仍然困扰着我,它就是用来教授线程安全的经典示例——共享计数器。我想知道是否有可能实现一个线程安全的计数器(在这个例子中是一个请求计数器),使用不可变对象(immutable对象)和函数概念,并完全避免同步。因此,这里首先是计数器的经典可变版本供引用(请原谅公共(public)成员变量,只是为了示例的简洁)可变的,非线程安全的版本:publicclassServletextendsHttpServlet{publicintrequestCount=0;@Overridep

java - 我应该对不可变类的突变尝试抛出异常吗?如果是这样,哪个异常(exception)?

我想在开发人员试图改变不可变对象(immutable对象)时提醒他。不可变对象(immutable对象)实际上是可变对象的扩展,并覆盖了该对象上的setter以使其不可变。可rebase类:Vector3publicclassVector3{publicstaticfinalVector3Zero=newImmutableVector3(0,0,0);privatefloatx;privatefloaty;privatefloatz;publicVector3(floatx,floaty,floatz){this.x=x;this.y=y;this.z=z;}publicvoidset

java - 谁能解释一下什么是状态和可变数据?

Incomputerscience,functionalprogrammingisaprogrammingparadigmthattreatscomputationastheevaluationofmathematicalfunctionsandavoidsstateandmutabledata.http://en.wikipedia.org/wiki/Functional_programming谁能解释一下什么是状态和可变数据?谁能给我JAVA或JavaScript的例子。 最佳答案 mutable表示任何可以改变的东西,即int

java - 不变性和可读性

所以我一直在阅读JoshuaBloch的EffectiveJava并注意到我在工作中实际遇到的两点。要点1:使用setter方法使代码更具可读性。在他的例子中,我们有一个类有一个非常大的构造函数。当人们实例化类时,很难说出所有参数的情况。因此,他建议制作一个简约的构造函数并为所有其他选项设置设置方法,而不是...MyClassclazz=newMyClass(a,b,c,d,e,f,g);你会写....MyClassclazz=newMyClass(a,b,c);clazz.setDitto(d);clazz.setEcho(e);clazz.setFunzies(f);clazz.s

java - 为什么字段在不可变类中应该是最终的?

Strategy对于定义不可变类来说,所有字段都应该是最终的。例如:privateStringname;为什么它必须是最终的?因为我没有为它提供setter方法?无法更改。谢谢。 最佳答案 如果你阅读privatefinalStringname;你知道这个字段是不可变的。如果你阅读privateStringname;您必须阅读整个类(class)以检查它是否有任何更改。这对您来说意味着更多的工作。您现在可能还记得,刚刚编写了没有添加setter的类,但是在编写了更多类之后,六个月后您阅读了自己的类,您可能记不太清了。即使现在没有更改