草庐IT

可变性

全部标签

java - 使用 LCDS 将不可变的 java 类序列化为 actionscript

我有一个复杂的对象,它由LCDSDataServices数据管理管理并使用自定义汇编程序创建/更新等。绝大多数对象层次结构都被正确地序列化/反序列化,但在序列化不可变Java类时我遇到了绊脚石。在只有java的世界中,我会使用javawriteReplace和readResolve方法,正如这篇优秀博客所描述的:http://lingpipe-blog.com/2009/08/10/serializing-immutable-singletons-serialization-proxy/这就是我最初编写我的java类的方式,希望livecycle调用writeReplace方法并及时将

java - volatile + 不可变持有者对象 = 线程安全?

我有一个来自“javaconcurrencypratique”一书的例子,他说volatile和不可变的持有者对象提供了线程安全性。但是我不明白书上给出的例子。代码如下:publicclassVolatileCachedFactorizerextendsGenericServletimplementsServlet{privatevolatileOneValueCachecache=newOneValueCache(null,null);publicvoidservice(ServletRequestreq,ServletResponseresp){BigIntegeri=extrac

java - 如何在双向关联中实例化不可变类?

我有两个不可变类:User和Department,它们使用双向关联连接-User引用了Department和Department有一个User列表。如何使用提供的用户创建一个新的部门实例?代码:classUser{privatefinalDepartmentdepartment;privatefinalStringname;publicUser(Departmentdepartment,Stringname){this.department=department;this.name=name;}}classDepartment{privatefinalListusers;private

java - 调用可变参数方法混合元素和元素数组不起作用

我有一个具有以下签名的方法:publicvoidfoo(String...params);所以所有这些调用都是有效的:foo("Peter","John");foo(newString[]{"Peter","John"});但是为什么这个无效呢?foo("Peter",newString[]{"John"}); 最佳答案 来自docs:Thethreeperiodsafterthefinalparameter'stypeindicatethatthefinalargumentmaybepassedasanarrayorasasequ

java - T...(泛型可变参数)真的在编译时被剥离为 Object[] 吗?

(我将在这里使用T来指代通用参数,用于参数化类。)我读到T...用作参数时是堆污染的潜在来源的原因是编译器对正常情况(没有T[]arraysallowed)规则,并允许T...(这是可变参数,因此通常会通过可变参数规则在内部转换为T[],除了这在泛型中是不允许的)作为参数通过在内部实现它就像它是原始类型一样,而是将其转换为Object[]的数组。所以我写了一些代码来验证这一点,将这个概念牢记在心。我将T...t作为方法的参数,然后System.out.println得到t.getClass[]。我希望得到Object[]的类,但我得到的是T[]的类。因此,编译器似乎在内部将T...t转

Java - 一种采用可变参数并返回数组列表的方法?

我对泛型不是很满意,因此还没有找到解决方案。我有这三种方法:publicstaticListobjectAAsList(ObjectA...items){returnnewArrayList(Arrays.asList(items));}publicstaticListobjectBAsList(ObjectB...items){returnnewArrayList(Arrays.asList(items));}publicstaticListobjectCAsList(ObjectC...items){returnnewArrayList(Arrays.asList(items));

java - 缓存方法导致不可变对象(immutable对象)

假设我有一个表示复数的简单接口(interface),它的实例是不可变的。为了简洁起见,我省略了明显的plus、minus、times和divide方法,它们只会创建并返回一个新的不可变实例。publicinterfaceComplex{doublereal();doubleimaginary();doubleabsolute();doubleangle();}现在的问题是,将其实现为不可变类的最佳方法是什么?最简单直接的“我只在性能出现问题时才关心它”的方法是将实部和虚部存储为最终字段,并在每次调用这些方法时计算绝对值和角度。这使类保持小而简单,但显然最后两个方法每次都返回相同的结果

java - 在java中使类不可变

要使类不可变,我可以做的是:1)使类最终2)不提供setter3)将所有变量标记为final但是如果我的类有其他类的另一个对象,那么有人可以更改该对象的值classMyClass{finalinta;finalOtherClassotherMyClass(inta,OtherClassother){this.a=a;this.other=other;}intgetA(){returna;}OtherClassgetOther(){returnother;}publicstaticvoidmain(Stringags[]){MyClassm=newMyclass(1,newOtherCl

java - 使用可变键解析 json

我刚想出了一个具有挑战性的问题。下面是json响应,其中键是可变的(一个GUID)我该如何解析它?我试过GoogleGson,但没用。{"87329751-7493-7329-uh83-739823748596":{"type":"work","status":"online","icon":"landline","number":102,"display_number":"+999999999"}} 最佳答案 如果您使用Gson,为了解析您的响应,您可以创建一个表示您的JSON数据的自定义类,然后您可以使用Map.请注意Map正是

Java:找出函数是用可变参数还是数组调用的

有没有办法找出采用可变参数的Java函数(或构造函数)实际上是用可变参数还是用数组调用的?假设我有以下内容:publicclassMyCompositeObjects{MyObject[]objects;MyCompositeObjects(MyObjects...objects){this.objects=Arrays.copyOf(objects,objects.length);//orjust:this.objects=objects;?}//...}可以使用单个MyObject[]参数调用构造函数,该参数稍后可能会更改,如果我不在构造函数中复制数组,这些更改将应用​​于成员变量