这个问题在这里已经有了答案:Whatismeantbyimmutable?(17个答案)关闭9年前。我试图准确理解Java字符串为何不可变。我知道这应该是一个简单的概念,但是在阅读了几个在线网页之后我还是不太明白。我不明白Java字符串为何“不可变”。我目前有以下代码:publicstaticvoidmain(String[]args){Stringname="JacobPerkins";System.out.println(name);name=name+"!";System.out.println(name);}我的输出如下:JacobPerkinsJacobPerkins!如果字
根据JSR-133不可变对象(immutable对象)是线程安全的,不需要同步。然而,可以使用反射更新最终字段的值:packagecom.stackoverflow;importjava.lang.reflect.Field;publicclassWhatsGoingOn{staticclassImmutable{privatefinalintvalue;publicImmutable(intvalue){this.value=value;}publicintgetValue(){returnvalue;}}publicstaticvoidmain(String[]args)throw
采用这两个Java类:classUser{finalInventoryinventory;User(Inventoryinv){inventory=inv;}}classInventory{finalUserowner;Inventory(Userown){owner=own;}}有什么办法withoutusingreflection*把它拉下来?我实际上并不期望它是,但问问也无妨。更新:因为在字节码构造中有两个步骤(1.分配对象,2.调用构造函数**)这是否可以(ab)用于执行此操作,使用手写字节码或自定义编译器?我说的是首先对两个对象执行步骤1,然后对两个对象执行步骤2,使用步骤1
我正在使用JAXB从XSD文件创建Java对象。我正在创建不可变包装器来隐藏JAXB生成的对象(之前我正在更新JAXB对象以实现不可变接口(interface)并将接口(interface)返回给客户端。但意识到更改自动生成的类是不好的,因此使用包装器)目前我正在将这些不可变的包装器返回给客户端应用程序。是否有任何选项可以使自动生成的类不可变,并且可以避免创建不可变包装器的额外工作。鼓励任何其他方法。谢谢 最佳答案 从JSR-133(Java1.5依赖项)开始,您可以使用反射来设置未初始化的最终变量。因此您可以在私有(private
刚刚看到下面的声明是因为immutableobjectImmutableobjectalwayshave“failureatomicity”(atermusedbyJoshuaBloch):ifanimmutableobjectthrowsanexception,it’sneverleftinanundesirableorindeterminatestate.谁能更详细地解释一下,为什么会这样? 最佳答案 Bloch的“失败原子性”意味着如果一个方法抛出异常,该对象之后应该仍然可用。通常,对象应处于与调用方法之前相同的状态。在不可变
我知道注释是不可变的,但是,Java中的数组本身并不是不可变的。运行测试后,我注意到从注释参数返回的数组可以改变,但它不会影响源数组:@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@interfaceArrayAnnotation{String[]value()default{};}@ArrayAnnotation({"foo"})publicclassMain{publicstaticvoidmain(String[]args){ArrayAnnotationtest=Main.class.getAnnot
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭9年前。Improvethisquestion不可变对象(immutable对象)(String除外,例如Integer和其他包装类等)是否适用于hashmap键?有人能解释一下吗?
为什么在Java中声明数组final不能使其不可变?声明某些东西不是意味着它不能改变吗?来自questionrelatedtoimmutablearray很明显,将数组声明为final并不会使它不可更改。以下是可能的。finalint[]array=newint[]{0,1,2,3};array[0]=42;我的问题是:那么这里声明final的作用是什么? 最佳答案 final只是关于它标记的reference;Java中没有不可变数组这样的东西。当你说privatefinalint[]xs=newint[20];你不能说xs=ne
今天在类里面,我的教授正在讨论如何组织类。该类(class)主要使用Java,我比老师有更多的Java经验(他来自C++背景),所以我提到在Java中应该支持不变性。我的教授让我证明我的回答是正确的,我给出了我从Java社区听到的理由:安全(尤其是线程)减少对象数量允许某些优化(尤其是垃圾收集器)教授质疑我的说法,他说他希望看到对这些好处的一些统计测量。我引用了大量的轶事证据,但即使这样做,我也意识到他是对的:据我所知,还没有关于不变性是否真的提供了它在现实世界代码中所promise的好处的实证研究。我从经验中知道确实如此,但其他人的经验可能会有所不同。那么,我的问题是,有没有对现实世
我一直在使用Guava的ImmutableMap用Builder有一段时间没有考虑它是如何/为什么工作的。我一直按照Javadoc描述的方式使用生成器:ImmutableMapWORD_TO_INT=newImmutableMap.Builder().put("one",1).put("two",2).put("three",3).build();我也看过例子elsewhere关于此语法的SO:ImmutableMapmyMap=ImmutableMap.builder().put("one",1).put("two",2).put("three",3).build();两者似乎产生完