Immutable objects
What is immutable object?
Immutable objects are simply objects whose state (the object's data) cannot change after construction. Examples of immutable objects from the JDK include String and Integer.
简言之:不可变对象就是在创建之后状态不可改变的对象,如String、Integer等。
Why Immuntable Objects?
Immutable objects greatly simplify your program, since they :
不可变对象最大程度上简化我们的程序,因为它们有如下优点:
- are simple to construct, test, and use
- are automatically thread-safe and have no synchronization issues
- do not need a copy constructor
- do not need an implementation of clone
- allow hashCode to use lazy initialization, and to cache its return value
- do not need to be copied defensively when used as a field
- make good Map keys and Set elements (these objects must not change state while in the collection)
- have their class invariant established once upon construction, and it never needs to be checked again
- always have "failure atomicity" (a term used by Joshua Bloch) : if an immutable object throws an exception, it's never left in an undesirable or indeterminate state
Immutable objects have a very compelling list of positive qualities. Without question, they are among the simplest and most robust kinds of classes you can possibly build. When you create immutable classes, entire categories of problems simply disappear.
不可变对象有一大堆的优点。毫无疑问,你可以用它构建极其简单、健壮的类。当你创建不可变类的时候,上面所提到的所有问题都没有了。
How to make an immutable class?
Make a class immutable by following these guidelines :
编写一个不可变的类要遵循以下原则:
- ensure the class cannot be overridden - make the class final, or use static factories and keep constructors private——类不能被覆盖或重写
- make fields private and final——所有的成员必须由private和final修饰
- force callers to construct an object completely in a single step, instead of using a no-argument constructor combined with subsequent calls to setXXX methods (that is, avoid the Java Beans convention)——调用者只能一步完成对象的创建,不要使用无参构造哈数和setXXX相结合的构造方式来构造对象
- do not provide any methods which can change the state of the object in any way - not just setXXX methods, but any method which can change state——不要提供任何可以改变对象状态方法,不仅仅是set方法,或者其它任何能够改变状态的方法。
- if the class has any mutable object fields, then they must be defensively copied when passed between the class and its caller ——如果类包含任何可变的对象,在类和它的调用者之间传递时必须拒绝复制。
让我们来一看String的一个例子
public class StringDemo {
public void sayHello(String str){
str = "Hello: "+str;
}
public static void main(String[] args) {
//String是不可变的,当它创建之后,它的值是不可以改变的
String str ="China";
new StringDemo().sayHello(str);
System.out.println(str);
String old_str;
old_str = str;
str = "Hello: "+str; /*str不在是原来String了,
此操作等价于str =
new String("Hello: "+str.toString())*/
//str与old_str为两个完全不相同的引用
//String objects are immutable they can be shared
System.out.println("new str:" + str);
System.out.println("old str:" + old_str);
//线程安全的可变字符串序列,支持同步操作,可变类
StringBuffer strBuffer;
//线程不安全的可变字符串序列,不支持同步操作,可变类
StringBuilder strBuilder;
/*strBuffer与strBuilder是可变对象,留给有心的读者自己去实验*/
}
}
输出:
China
new str:Hello: China
old str:China
参考文献:
- http://www.javapractices.com/topic/TopicAction.do?Id=29
- http://www-sop.inria.fr/everest/events/cassis05/Transp/poll.pdf
分享到:
相关推荐
总的来说,这个“21-C-ImmutableObject-Code.zip”教程将帮助你理解如何在C#中利用不可变对象模式,以及它如何提高代码的可靠性和性能。通过学习和实践代码示例,你可以更好地掌握这一关键的编程技巧,无论是在日常...
#ImmutableObject ImmutableObject 被创建为一种简单的客户端 Javascript 方式来制作不可变对象。 它使用一组简单的方法来获取和设置项目。 仅当您为isExtensible传递true参数时才允许设置项目。 ##基本用法: 可以...
在IT领域,不可变对象(Immutable Object)是一种一旦创建就无法改变其状态的对象。这种特性在多线程编程、函数式编程以及数据安全等方面有着重要的应用。不可变队列(Immutable Queue)是其中的一种实现,它不允许...
节点不变对象 imobject允许您创建深度不可变JavaScript对象。 设置属性后,将无法添加其他属性,并且无法修改初始属性。...var immutable = new IMObject({ foo: 'bar', nested: { foo: 'baz' } }); //
深拷贝&浅拷贝总结非集合对象[immutableObject copy]是浅拷贝[immutableObject mutableCopy]是深拷贝[mutabl
不可变对象(immutable object)是一种一旦创建就不能再改变它的内容的对象,而不可变类(immutable class)是指该类的所有数据都是私有的且没有修改器。例如,Circle 类如果删掉前面的 set 方法,那么该类就变成不...
在编程领域,不可变对象(Immutable Object)是一种特殊类型的对象,一旦创建,其状态就不能被修改。这种设计模式在Java等编程语言中广泛应用于提高并发性能、保证数据安全以及简化编程逻辑。本篇文章将深入探讨如何...
seamless-immutable 库与 Immutable.js 学院派的风格不同,seamless-immutable 并没有实现完整的 Persistent Data Structure,而是使用 Object.defineProperty 扩展了 JavaScript 的 Array 和 Object 对象来实现,只...
值则指对象的当前状态,对于不可变对象(immutable object),如整数、浮点数、字符串和元组,它们的值在创建后不能更改。而对于可变对象(mutable object),如列表、字典和集合,值可以修改。 特殊方法是Python中...
- 对于不可变对象(Immutable Object),原型模式是不必要的,因为它们本身就无法改变状态。 总结来说,原型模式提供了一种通过复制已有对象来创建新对象的方式,它在性能优化和简化复杂对象构造过程中起着重要作用...
2. **字符串**:在Java中,字符串是不可变的对象(immutable object),这意味着一旦创建,其内容就不能更改。但是,为了提高灵活性,`String`类提供了`length()`方法来获取字符串的实际长度。 #### 五、为什么没有...
12. **不可变对象的修改(Modifying Immutable Object)** 尝试修改不可变对象(如String、BigDecimal等)将不会改变原始对象,而是创建一个新的对象。确保理解对象的可变性,避免不必要的复制。 通过理解这些常见...
- 不可变对象(immutable object)是指一旦创建就无法改变其状态的对象。被 `static` 和 `final` 修饰的 `Date` 对象(A)并不一定是不可变的,因为 `Date` 类在某些版本的 Java 中是可变的。选项 B 中,使用 State...
- 对于不可变对象(Immutable Object),无需使用原型模式,因为它们本身就是安全的复制。 总结,原型模式在Android开发中可以有效地减少重复代码,提高代码复用性,特别是在需要大量创建相似对象的情况下。通过...
这对于创建不可变对象(immutable object)非常重要。 #### 二、final的具体应用 ##### 1. final类 - **定义**:当一个类被声明为final时,该类不能被其他类继承。 - **目的**: - 避免子类对父类的实现细节进行...
- **不可变对象 (Immutable Object):** 不可变对象是指创建后其状态就不能改变的对象。String类就是一个典型的不可变对象。 #### 六、常用类与数据结构 **数字类:** - **BigInteger/BigDecimal:** BigInteger和...
#### 不可变对象(Immutable Object) 不可变对象是指一旦创建后就不能被改变的对象。在 Java 中创建不可变对象的关键步骤包括: - **将所有的数据字段设为私有**:确保外部代码不能直接访问和修改对象的状态。 - ...
**String 类** 在 Java 语言中扮演着极其重要的角色,它是不可变的对象(immutable object),这意味着一旦一个 `String` 对象被创建,它的值就不能被更改。这特性使得 `String` 类非常适合用于处理文本数据。 ####...
本文将深入探讨“immutable-require-valid-optional-object”这一特定的开源库,它专注于处理不可变对象,并确保传入的对象参数是有效的。 “immutable-require-valid-optional-object”库的核心理念是维护数据的不...
#### 十、`mutating method sent to immutable object` **问题描述:** 发送可变方法给不可变对象,例如尝试向`NSDictionary`发送`setValue:`消息。 **解决方案:** 1. 确保对象类型正确,将`NSDictionary`更改为`...