您的位置:首页 > 编程语言 > Java开发

Java中的不可变类的概念及实现思路分析

2016-11-16 20:25 916 查看
一道面试题:什么是不可变类,请试着设计一个不可变类。

    不可变类,可以理解为,只允许读,不允许修改的类。类的对象一旦创建,就不能再进行修改了。Java语言之所以设计有很多的不可变类,

主要是不可变类具有下面的优点:使用简单、线程安全、节省内存。但是缺点也很明显,不可变类的对象会因为值的不同,而产生新的对象,
比如我们在进行字符串的修改操作时,会生成多个String对象。import java.util.Date;
/**
* @description java中的不可变类学习---如何设计一个不可变类
* ImmutableClass_0,错误的方法演示
*/
public class ImmutableClass_0 {

public static void main(String[] args) {
// -------------- String类 --------------
// String类的状态是不可改变的,因此str的引用不变,一直都是指向"str的初始值为00000"
// 即使执行了这段代码:str = "str的初始值为11111";str对象仍然不变。
String str = "str的初始值为00000";
System.out.println("str.hashCode() : " + str.hashCode());
InnerClass_str innerClass_str = new InnerClass_str(str);
innerClass_str.printStr();
// 改变str的值
str = "str的初始值为11111";
System.out.println("str.hashCode() : " + str.hashCode());
innerClass_str.printStr();

// -------------- Date类 --------------
// Date类的状态是可以改变的,当改变date的状态时,当前内存中有2个date对象。
// 也就是说现在date对象有了2个副本。
// 当被引用对象date的状态发生改变时,会导致innerClass_date对象的改变
Date date = new Date();
System.out.println("date.hashCode() : " + date.hashCode());
InnerClass_date innerClass_date = new InnerClass_date(date);
innerClass_date.printStr();
// 改变date的值
date.setMonth(8);
System.out.println("date.hashCode() : " + date.hashCode());
innerClass_date.printStr();
}
}

final class InnerClass_date{

private Date date;
//构造方法
public InnerClass_date(Date date){
this.date = date;
}

public void printStr(){
System.out.println("date : " + date);
}
}

final class InnerClass_str{

private String str;
//构造方法
public InnerClass_str(String str){
this.str = str;
}

public void printStr(){
System.out.println("str : " + str);
}
}
控制台输出:

str.hashCode() : -153435823
str : str的初始值为00000
str.hashCode() : -152481518
str : str的初始值为00000
date.hashCode() : 1793288403
date : Wed Nov 16 10:07:18 CST 2016
date.hashCode() : 817855708
date : Fri Sep 16 10:07:18 CST 2016
import java.util.Date;
/**
* @description java中的不可变类学习---如何设计一个不可变类
* ImmutableClass_1,正确的方法演示
*/
public class ImmutableClass_1 {

public static void main(String[] args) {

// -------------- Date类 --------------
// Date类的状态是可以改变的,当改变date的状态时,当前内存中有2个date对象。
// 也就是说现在date对象有了2个副本。
// 当被引用对象date的状态发生改变时,会导致innerClass_date对象的改变
Date date = new Date();
System.out.println("date.hashCode() : " + date.hashCode());
InnerClass_date2 innerClass_date = new InnerClass_date2(date);
innerClass_date.printStr();
// 改变date的值
date.setMonth(8);
System.out.println("date.hashCode() : " + date.hashCode());
innerClass_date.printStr();
}
}

final class InnerClass_date2{

private Date date;
//构造方法
public InnerClass_date2(Date date){
// 解除了引用关系,通过克隆,生成了一个新的对象
this.date = (Date) date.clone();
}
public void printStr(){
System.out.println("date : " + date);
}
}


控制台输出:
date.hashCode() : 1793318742
date : Wed Nov 16 10:07:48 CST 2016
date.hashCode() : 817886041
date : Wed Nov 16 10:07:48 CST 2016
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: