Tag: 不变性

每个不可变的class级应该是最终的吗?

我正在设计一个用于二十一点游戏的Card类。 我的设计是使用getValue()创建一个Card类,例如,返回11表示J,12表示Q,13表示K,然后使用BlackjackCard类扩展它以覆盖该方法,以便这些卡返回10。 然后有些东西击中了我:Card类的对象应该是不可变的。 所以我重新阅读Effective Java 2nd Edition,看看该做什么,我发现不可变类需要是最终的,以避免子类打破不变性。 我也看过互联网,每个人似乎都同意这一点。 Card类应该是最终的吗? 你怎么能打破这个类的不变性,扩展它: class Card { private final Rank rank; private final Suit suit; public Card(Rank rank, Suit suit) { this.rank = rank; this.suit = suit; } public Rank getRank() { return rank; } public Suit getSuit() { return suit; } public int getValue() { return rank.getValue(); } […]

Java不可变对象

我正在学习不变性的概念。 我知道一旦创建了对象,不可变对象就无法更改它们的值。 但我不明白以下对不可变对象的使用。 他们是 是自动线程安全的,没有同步问题。 How ? Proof ? 不需要复制构造函数。 How ? Any example ? 不需要克隆的实现How ? Any example ? How ? Any example ? 用作场时不需要防守复制How ? Any example ? How ? Any example ? 总是有”failure atomicity” (a term used by Joshua Bloch) :如果一个不可变对象抛出exception,它就永远不会处于不受欢迎或不确定的状态。 How ? Any example ? 有人可以通过支持它的例子详细解释这些要点吗? 谢谢。

有效的不可变对象有意义吗?

在Java Concurrency In Practice一书中,它解释了“有效不可变”对象与可变对象并发性的优点。 但它没有解释“有效不可变”对象在真正不可变对象上提供的优势。 我不明白:在你决定安全地发布一个“有效不可变”的对象的那一刻,难道你不能总是构建一个真正不可变的对象吗? (而不是做你的“安全发布”,你建立一个真正不可变的对象,就是这样) 当我正在设计类时,我无法看到我不能总是构建一个真正不可变对象的情况(如果需要使用委托等来构建其他包装对象,当然它们本身就是真正的不可改变的)我此刻决定“安全地发布“。 那么“有效不可变”的对象和他们的“安全出版物”只是一个糟糕的设计或糟糕的API的案例? 你将被迫使用一个有效的不可变对象,并被迫安全地发布它,你无法建立一个更优越的真正不可变对象?

所有最终类都是不可变的吗?

Java中的所有最终类都是不可变的。 String和Integer都是最终的类,两者都是不可变的。

使对象不可变的可能方法

我正在寻找一种有效的方法来构建一个不可变的类,就像Java的String类一样。

有效地“修改”ImmutableMap

我们目前正在使用Guava作为其不可变的集合,但我惊讶地发现他们的地图没有方法可以轻松创建新的地图,只需稍作修改。 最重要的是,他们的构建器不允许为键分配新值或删除键。 因此,如果我只想修改一个值,这就是我希望能够做到的: ImmutableMap<Guid, ImmutableMap> originalMap = /* get the map */; ImmutableMap<Guid, ImmutableMap> modifiedMap = originalMap.cloneAndPut(key, value); 这就是Guava期待我做的事情: ImmutableMap<Guid, ImmutableMap> originalMap = /* get the map */; Map<Guid, ImmutableMap> mutableCopy = new LinkedHashMap(originalMap); mutableCopy.put(key, value); originalMap = ImmutableMap.copyOf(mutableCopy); /* put the map back */ 通过这样做,我得到了我想要的修改的地图的新副本。 原始副本不受影响,我将使用primefaces引用将事物放回去,因此整个设置是线程安全的。 它只是很慢。 这里有很多浪费的复制品。 假设地图中有1,024个桶。 当你可以按原样使用那些不可变的桶并且只克隆其中一个时,那就是你不必要地再次创建的1,023个桶(也是每个两次)。 所以我想: 是否有一种Guava实用方法埋藏在某处? (它不在地图或ImmutableMap.Builder中。) 有没有其他Java库可以做到这一点? […]

Jackson的不可变/多态POJO JSON序列化

我正在尝试使用Jackson 2.1.4将不可变的POJO与JSON序列化,而不必编写自定义序列化程序并尽可能少注释。 我还想避免为了满足Jackson库而添加不必要的getter或默认构造函数。 我现在坚持exception: JsonMappingException:找不到类型[simple type,class Circle]的合适构造函数:无法从JSON对象实例化(需要添加/启用类型信息?) 代码: public abstract class Shape {} public class Circle extends Shape { public final int radius; // Immutable – no getter needed public Circle(int radius) { this.radius = radius; } } public class Rectangle extends Shape { public final int w; // Immutable – no getter needed public […]

为什么不声明一个数组最终使它在Java中不可变?

为什么不声明一个数组最终使它在Java中不可变? 不宣布最终意味着它无法改变? 从与不可变数组相关的问题中可以清楚地看出,声明一个数组final并不能使它不可更改。 以下是可能的。 final int[] array = new int[] {0, 1, 2, 3}; array[0] = 42; 我的问题是:在这里宣布决赛的function是什么?

常量对象与不可变对象

我可以在术语“不可变对象”的位置使用术语“常量对象”吗? 虽然我觉得对象的Immutable是变量的常量,但我不确定这个术语是否被接受。 请帮我理解。 谢谢,Karthick S.

为什么String类是不可变的,即使它有一个名为“hash”的非最终字段

我正在阅读约书亚布洛赫的有效Java第15项。 在第15项中谈到“最小化可变性”时,他提到了使对象不可变的五条规则。 其中之一就是让所有领域都是最终的。 这是规则: 使所有字段成为最终字段 :这清楚地以系统强制执行的方式表达您的意图。 此外,如果对新创建的实例的引用在没有同步的情况下从一个线程传递到另一个线程,则必须确保正确的行为,如内存模型中所述[JLS,17.5; Goetz06 16]。 我知道String类是一个不可变类的例子。 通过源代码我看到它实际上有一个非最终的哈希实例。 //Cache the hash code for the string private int hash; // Default to 0 String如何成为不可变的呢?