草庐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但我应该更喜欢哪一个?

java - 在 Java 中与不可变对象(immutable对象)共享内部结构是什么意思?

我一直在阅读EffectiveJava并且我看到这样的说法:您不仅可以共享不可变对象(immutable对象),还可以共享它们的内部结构。但是,我正在努力弄清楚这真正的含义,并且示例肯定会有所帮助,因为书中没有给出示例。我已经知道不可变对象(immutable对象)无法更改,例如String。 最佳答案 阅读book进一步:TheBigIntegerclassusesasign-magnituderepresentationinternally.Thesignisrepresentedbyanintandthemagnitudeis

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 - 具有非最终字段的不可变对象(immutable对象)如何成为线程不安全的?

假设我们有这个//Thisistriviallyimmutable.publicclassFoo{privateStringbar;publicFoo(Stringbar){this.bar=bar;}publicStringgetBar(){returnbar;}}是什么让这个线程不安全?继此question. 最佳答案 Foo在安全发布后是线程安全的。例如,这个程序可以打印“不安全”(它可能不会使用热点/x86的组合)——如果你将bar设置为final,它就不会发生:publicclassUnsafePublication{st

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