草庐IT

Immutability

全部标签

java - Java 中的不变性

我试图将所有东西放在一起定义“不变性”。项目(3)here是说,作为创建不可变对象(immutable对象)的规则之一,Dontallowsubclassestooverridemethods.Thesimplestwaytodothisistodeclaretheclassasfinal....覆盖的方法在子类的实例上运行。而且,据我所知,一个不可变的类是其中一个对象,一旦它们被实例化就被“雕刻”在内存中——没有它的成员,因此不能更改对象。将这些放在一起——“不可变”的定义是否适用于类和对象?通过完成方法,我可以防止在类被扩展时重写它的方法。我看不出完成不可变类的方法如何进一步增加其

java - Guava ImmutableSet : Builder vs. 的?

Javadoc对于com.google.common.collect.ImmutableSet建议有两种方法可以创建ImmutableSet的实例来自E类型的元素(例如Ee1和Ee2)尚未在集合中(即忽略从现有集合创建的copyOf方法):“的”方法:ImmutableSetset=ImmutableSet.of(e1,e2);build者:ImmutableSetset=newImmutableSet.Builder().add(e1).add(e2).build();这两种方法都使用ImmutableSet.Builder#construct但我应该更喜欢哪一个?

immutability - 不可变 JDK 类的完整列表?

jdk中是否有事实上不可变类的列表?技术上不可变类包括明显的Integer、Double等。事实上的不可变将包括例如java.lang.String-它在技术上可能是可变的,但事实上它不是。此外,是否存在要求(如javadoc中所述)不可变的接口(interface)/抽象类?如果您不能提供完整的列表,如果您知道一堆在其javadoc中声明不可变性的类,我会很高兴。 最佳答案 我尽可能多地编译列表:java.lang.字符串基本类型的包装类:java.lang.Integerjava.lang.Bytejava.lang.Chara

java - 创建没有最终字段的不可变对象(immutable对象)?

我们可以创建一个不可变对象(immutable对象)而不需要所有字段都为final吗?如果可能的话,举几个例子会有帮助。 最佳答案 将所有字段声明为私有(private)并仅定义getter:publicfinalclassPrivate{privateinta;privateintb;publicintgetA(){returnthis.a;}publicintgetB(){returnthis.b;}}引用@JonSkeet的评论,final类修饰符可用于:WhileaninstanceofjustPrivateisimmuta

Java 不可变列表

我目前正在构建一个LRU缓存,我需要在其中存储最后N个插入的项目。项目将被频繁插入(即许多写入操作),而读取操作通常会返回大量事件始终严格按顺序,尽管从缓存中的任意点开始。例如,假设缓存包含事件:[1,2,3,4,5,6]合法的读取操作是返回事件[2,3,4]上的迭代器。由于读取操作可能会长期存在,我想使用一种数据结构,在这种结构中我可以安全地为每次读取尝试迭代序列的逻辑副本,从而防止缓存读取从阻止任何后续写入。但是,使用原始JavaArrayList或LinkedList意味着制作完整副本的开销很大。我的问题:是否有任何第3方Java库提供类似于Scala的不可变数据结构,从而修改数

java - 如何使其中包含 Date 对象的类不可变?

这只是从学术学习的角度来看。我所知道的是,每当我们想让一些类不可变时,-它必须由最终原始字段组成-在对象构造期间引用不会转义-如果使用其他对象,那么这些对象也需要递归不可变或API不可变类,如java.lang.String,以及其他一些详细的注意事项!但我最近遇到了一个问题,其中面试官要求候选人创建一个不可变的类,其中包含java.util.Date。我的第一印象告诉我这是不可能的,尽管我们可以使用包含日期字符串而不是Date对象本身的String来解决问题。请澄清一下。谢谢。 最佳答案 要使类不可变,最简单的做法是创建Date对

java - String get/set 是线程安全的吗?

假设我有以下内容,publicclassFoo{privateStringbar;publicStringgetBar(){returnbar;}publicvoidsetBar(Stringbar){this.bar=bar;}}由于String类的不可变特性,这些方法是否自动线程安全,或者是否需要某种锁定机制? 最佳答案 不,这不是线程安全的。Foo是可变的,所以如果你想确保不同的线程看到相同的值bar–即一致性–或者:制作barvolatile,或制作方法synchronized,或使用AtomicReference.bar的

java - guava的ImmutableXXX真的是不可变的吗?

我已经使用guava一段时间了并且非常信任它,直到昨天我偶然发现了一个例子,这让我开始思考。长话短说,这里是:publicstaticvoidtestGuavaImmutability(){StringBuilderstringBuilder=newStringBuilder("partOne");ImmutableListmyList=ImmutableList.of(stringBuilder);System.out.println(myList.get(0));stringBuilder.append("appended");System.out.println(myList.g

java - 不可变类/对象,私有(private)构造函数,工厂方法

已经阅读了如何通过以下步骤使类不可变不要提供“setter”方法——修改字段或字段引用的对象的方法。将所有字段设为最终字段和私有(private)字段。不允许子类覆盖方法。最简单的方法是将类声明为final。一种更复杂的方法是将构造函数设为私有(private)并在工厂方法中构造实例。如果实例字段包含对可变对象的引用,则不允许更改这些对象:一种。不要提供修改可变对象的方法。b.不要共享对可变对象的引用。永远不要存储对传递给构造函数的外部可变对象的引用;如有必要,创建副本并存储对副本的引用。同样,必要时创建内部可变对象的副本,以避免在方法中返回原始对象。我不确定我是否清楚地理解私有(pr

java - 如何在 Java 中扩展不可变类型

在从事游戏项目时,我开始使用Java中的不可变值对象,遵循“公共(public)最终字段”方法:publicclassTeam{publicfinalStringname,flag;publicTeam(Stringname,Stringflag){this.name=name;this.flag=flag;}}到目前为止,这对我来说效果很好,但在不同的情况下,我需要关于团队的不同的额外信息集。例如,一支球队在比赛中有固定的颜色。问题是,处理这些扩展信息集的最佳方式是什么?我知道这是一个相当普遍的问题,但我想继续使用不可变对象(immutable对象),这可能会影响解决方案。这是我想出