Tag: immutability

不可变的番石榴collections品的缺陷?

我不确定我理解的不可变集合的缺陷是否正确,所以我在这个答案中列出它们。 希望有人在这里纠正我。 a):与Collections.unmodifiableXXX()相比,ImmutableXXX.copyOf() 丢失了源集合function 。 例如,当将linkedList放入ImmutableList.copyOf()时,不再链接ImmutableList。 与基于树的集合相同。 b):人们认为Collections.unmodifiableXXX只使用相同的源集合引用,因此一旦源集合发生更改,Collections.unmodifiableXXX也会更改。 但我的解决方案是将源集合包装到临时集合中,该集合传递给ImmutableXXX.copyOf()。 见下面的代码: List l = new ArrayList(); List unmodifiableList = Collections.unmodifiableList(l); ImmutableList immutableList= ImmutableList.copyOf(l); l.add(“a”);//unmodifiableList is also added “a”, immutableList not. /*My solution as follows: So unmodifiableList2 is also immutable as ImmutableList.copyOf(l) does*/ List unmodifiableList2= Collections.unmodifiableList(new ArrayList(l)); 您对Immutable系列的理解是什么? 谢谢!

Java:如何在一个类中创建私有字段Map不可变?

public class Hi { private final Map map; public Map getMap() { return map; } } 我有这个Hi类,我希望map是不可变的。 我还需要一个吸气剂。 目前,另一个类可以从getter修改映射。 我想返回一个地图副本来解决这个问题,但Map是一个接口,所以这意味着我必须进行getter调用: return new HashMap(map); 有没有其他方法可以做到这一点,而不强制地图是一个哈希映射? 我希望它能像以前一样保持同一级别。

关于不可变类防御性复制

我有一个关于创建Immutable类的查询。 以下是我考虑的要点: 让课程最终 使所有成员最终,在静态块或构造函数中显式设置它们 让所有成员都私密 否修改状态的方法 要非常小心地限制对可变成员组件的访问(请记住该字段可能是最终的,但对象仍然可以是可变的。即私有最终日期imStillMutable) – 请参阅防御性复制或其表兄弟拷贝构造函数以获取更多信息。 但是我完全不明白这一点,请你告诉或给我一个例子,其中5点在这个例子中是清楚的?

Scala中的不变性和线程安全性

我正在阅读实践中的Java并发书,当我读到不变性和线程安全之间的关系时,我试图深入了解。 所以,我发现至少有一个用例,在Java中构造一个不可变类可以导致发布一个非正确构造的对象。 根据此链接,如果类的字段未final解析,则编译器可以重新排序需要完成的语句以构造对象。 实际上,根据此链接,要构建对象,JVM需要执行以下非primefaces操作: 分配一些内存 创建新对象 使用默认值初始化其字段(布尔值为false,其他基元为0,对象为null) 运行构造函数,其中包括运行父构造函数 为新构造的对象分配引用 我的问题是:Scala怎么样? 我知道Scala基于Java的并发模型,因此它基于相同的Java内存模型。 例如, case class es线程安全是否与上述构造问题有关? 谢谢大家。

一个集合在Java中最终是什么意思?

在Java中将集合声明为final是什么意思? 是不是可以添加更多元素? 是否已经存在的元素无法改变? 还有别的吗?

jacksonJSON,不可变类和接口

我正在使用Jackson示例,并且在使用不可变类和接口进行反序列化时遇到一些麻烦。 以下是我的代码: package com.art.starter.jackson_starter; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; /** * Hello world! * */ public class App { public static void main( String[] args ) throws JsonGenerationException, JsonMappingException, IOException { System.out.println( “Hello World!” ); AddressImpl.AddressBuilder builder = new AddressImpl.AddressBuilder(); NameImpl.Builder nameBuilder = new NameImpl.Builder(); UserImpl.Builder userBuilder = […]

Java中可变对象的封装

我正在学习“Java SE 7程序员I和II学习指南”,我不明白下面的解释。 class Fortress{ private String name; private ArrayList list; Fortress() {list=new ArrayList; String getName{return name;} void addToList(int x){list.add(x);} ArrayList getList(){return list;} // line 1 } 哪行代码打破了封装? 答案:第9行。“当封装像ArrayList这样的可变对象时,你的getter必须返回对该对象副本的引用,而不仅仅是对原始对象的引用”。 我没有理解解释或如何修改原始代码。 所以在getList()而不是 return list; 我们应该这样做吗? ArrayList list2=list; return list2;

为什么Lucene不支持对现有文档的任何类型的更新

我的用例涉及索引Lucene文档,然后在以后的多个场合添加指向此现有文档的术语,即不删除和重新添加每个新术语的整个文档(因为性能,而不是保留原始术语)。 我知道文档无法真正更新。 我的问题是为什么? 或者更确切地说,为什么不支持所有forms的更新(术语,存储字段)? 为什么不可能添加另一个术语来指向现有文档 – 从技术上讲:并非所需要的只是将现有文档ID放在术语的发布列表中。 为什么那么难? 是否存在一些不可变的统计数据? 是否有任何变通方法可以支持我在现有文档中添加术语(索引字段)的用法?

字符串是不可变的 – 这意味着我永远不应该使用+ =而且只能使用StringBuffer?

字符串是不可变的,这意味着,一旦创建它们就无法更改。 那么,这是否意味着如果你用+ =附加东西比你创建一个StringBuffer并附加文本那么需要更多的内存? 如果你使用+ =,每次必须保存在内存中时你会创建一个新的’对象’,不是吗?

初始化按需持有者成语线程安全,没有最终修饰符

我有一种预感,即使用持有者惯用语而不将持有者字段声明为final是不是线程安全的(由于Java中的不变性方式)。 有人可以证实这一点(希望有一些消息来源)吗? public class Something { private long answer = 1; private Something() { answer += 10; answer += 10; } public int getAnswer() { return answer; } private static class LazyHolder { // notice no final private static Something INSTANCE = new Something(); } public static Something getInstance() { return LazyHolder.INSTANCE; } } 编辑:我绝对想要源语句,而不仅仅是“它有效”的断言 […]