JoshuaBloch给出的一个建议是,类应该设计为不可变的。我有以下类(class)publicclassDividend{publicDividendsetDate(SimpleDatedate){Dividenddividend=newDividend(this.getStock(),this.getAmount(),date);returndividend;}.....//Moretogo.对于setDate方法,this对象不会被修改。相反,将返回修改了日期字段的this的克隆副本。但是,通过方法名称判断,用户如何知道这个对象仍然保持不可变?除了setDate,还有更好的命名
我创建了一个带有日期字段的不可变类。我如何确保即使日期字段也是不可变的,因为即使您将日期字段设置为final,您以后仍然可以为其分配不同的值? 最佳答案 在您的getDate()方法中,返回一个newDate()实例,而不是相同的实例。publicDategetDate(){//Notcorrect.returnthis.date;//Thiswillmakeyourclassmutable.//Insteaduse,returnnewDate(this.date.getTime());//Thiswillmakesureyourd
我正在开发一个类库。我有一个矩阵的抽象基类Matrix,它提供一些基本方法的实现。从Matrix派生的是不同类型矩阵的具体子类。我要求矩阵是可克隆的,所以Matrix实现了Cloneable接口(interface)。一些从Matrix派生的类是不可变的不可变类的克隆方法不返回对象的克隆,而是返回对象本身是否可以接受?用于澄清的一些(过于简化的)代码:abstractclassMatriximplementsCloneable{...}classImmutableMatrixextendsMatrix{ImmutableMatrixclone(){returnthis;}...}cla
我正在尝试使用JDK7中的JavaNIO.2API。特别是,我想调用方法:Paths#get(Stringfirst,String...more)这是一个静态方法,它接收至少一个字符串,并返回一个与之对应的Path对象。有一个重载形式:Paths#get(URIuri)但是,我似乎无法从Clojure中调用top方法。我似乎能得到的最近的是:(Paths/get^Stringdir-fq(object-array0))失败:java.lang.ClassCastException:[Ljava.lang.Object;cannotbecastto[Ljava.lang.String;如
这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:bugwithvarargsandoverloading?谁能给我解释一下这个是如何工作的:classVararg{staticvoidvararg(int...x){System.out.println("Integer...");}staticvoidvararg(long...x){System.out.println("long...");}publicstaticvoidmain(String[]args){ints=0;vararg(s,s);}}获取编译时错误classVararg{staticv
我想在开发人员试图改变不可变对象(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
Incomputerscience,functionalprogrammingisaprogrammingparadigmthattreatscomputationastheevaluationofmathematicalfunctionsandavoidsstateandmutabledata.http://en.wikipedia.org/wiki/Functional_programming谁能解释一下什么是状态和可变数据?谁能给我JAVA或JavaScript的例子。 最佳答案 mutable表示任何可以改变的东西,即int
所以我一直在阅读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
Strategy对于定义不可变类来说,所有字段都应该是最终的。例如:privateStringname;为什么它必须是最终的?因为我没有为它提供setter方法?无法更改。谢谢。 最佳答案 如果你阅读privatefinalStringname;你知道这个字段是不可变的。如果你阅读privateStringname;您必须阅读整个类(class)以检查它是否有任何更改。这对您来说意味着更多的工作。您现在可能还记得,刚刚编写了没有添加setter的类,但是在编写了更多类之后,六个月后您阅读了自己的类,您可能记不太清了。即使现在没有更改
你会扔一个IllegalStateException吗?如果:由于一个或多个字段的值,方法无法完成其工作这些字段是final并且只在构造函数中赋值?教科书示例:您的类是不可变的Collection并且您的方法应该返回最大元素,但此实例为空。我已阅读KevinBourillon`sblogpost关于这个主题,我不确定适用哪条规则。UnsupportedOperationException-thismeansthatthemethodinvokedwillalwaysfailforaninstanceofthisclass(concretetype),regardlessofhowthe