根据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的“失败原子性”意味着如果一个方法抛出异常,该对象之后应该仍然可用。通常,对象应处于与调用方法之前相同的状态。在不可变
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭9年前。Improvethisquestion不可变对象(immutable对象)(String除外,例如Integer和其他包装类等)是否适用于hashmap键?有人能解释一下吗?
这个问题在这里已经有了答案:OperatoroverloadinginJava(10个答案)关闭5年前。我可以创建一个仅使用=运算符实例化的类,就像String类一样吗?或者这是Java中的String类特有的功能?
两者有什么区别?一个实体应该使用一个还是两者都使用? 最佳答案 对于entity来说几乎没有区别。@Immutable获得优先级(也就是说,如果您的实体同时被注释为@Immutable和@Entity(mutable="true"),它是将被视为不可变的)。@Immutable也可以用于具有几乎相同语义的集合。详情为here 关于java-使用Hibernate时@Immutable和@Entity(mutable=false)有什么区别,我们在StackOverflow上找到一个类似的
protocols.forEach{$0.prop=nil}结果:Cannotassigntoproperty:'$0'isimmutable我解决了这个问题:protocols.forEach{varprotocol=$0protocol.prop=nil}但是为什么编译器可以接受呢?我希望它能解决这个问题。 最佳答案 您有一组实现协议(protocol)的项目。如果你不告诉Swift这是一个AnyObject协议(protocol)(或早期版本的Swift中的class协议(protocol)),它会假定它可以通过一个实现>结构
protocols.forEach{$0.prop=nil}结果:Cannotassigntoproperty:'$0'isimmutable我解决了这个问题:protocols.forEach{varprotocol=$0protocol.prop=nil}但是为什么编译器可以接受呢?我希望它能解决这个问题。 最佳答案 您有一组实现协议(protocol)的项目。如果你不告诉Swift这是一个AnyObject协议(protocol)(或早期版本的Swift中的class协议(protocol)),它会假定它可以通过一个实现>结构
classUnit{privatereadonlystringname;privatereadonlydoublescale;publicUnit(stringname,doublescale){this.name=name;this.scale=scale,}publicstringName{get{returnname;}}publicstringScale{get{returnscale;}}privatestaticUnitgram=newUnit("Gram",1.0);publicUnitGram{get{returngram;}}}多个线程可以访问Unit.Gram。为什