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

一道面试题:什么是不可变类,请试着设计一个不可变类。
    不可变类,可以理解为,只允许读,不允许修改的类。类的对象一旦创建,就不能再进行修改了。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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值