当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:14:00  来源:本站整理

Java理论与实践: 变还是不变?[Java编程]

赞助商链接



  本文“Java理论与实践: 变还是不变?[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

不变对象是指在实例化后其外部可见状况无法更改的对象.Java 类库中的 String 、 Integer 和 BigDecimal 类就是不变对象的示例 ― 它们表示在对象 的生命期内无法更改的单个值.

不变性的所长

假如精确利用不变类,它们会极大地简化编程.因为它们只能处于一种状况 ,所以只要精确构造了它们,就决不会陷入不一致的状况.您没必要复制或克隆不 变对象,就可以安闲地同享和高速缓存对它们的引用;您可以高速缓存它们的字段 或其办法的后果,而不用耽忧值会不会变成失效的或与对象的别的状况不一致. 不变类普通产生最好的映射键.并且,它们本来就是线程安全的,所以没必要在线 程间同步对它们的拜候.

安闲高速缓存

因为不变对象的值没有更改的危险,所以可以安闲地高速缓存对它们的引用 ,并且可以必定今后的引用仍将引用同一个值.一样地,因为它们的特点无法更 改,所以您可以高速缓存它们的字段和其办法的后果.

假如对象是可变的,就必须在存储对其的引用时惹起注意.请考虑清单 1 中 的代码,此中布列了两个由调度程序履行的任务.目的是:目前启动第一个任务 ,而在某一天启动第二个任务.

清单 1. 可变的 Date 对象的潜在问题

Date d = new Date();
  Scheduler.scheduleTask(task1, d);
  d.setTime(d.getTime() + ONE_DAY);
  scheduler.scheduleTask(task2, d);

因为 Date 是可变的,所以 scheduleTask 办法必须当心地用防备办法将日 期参数复制(大概通过 clone() )到它的内部数据构造中.不然, task1 和 task2 大概都在明天履行,这可不是所盼望的.更糟的是,任务调度程序所用的 内部数据构造会变成讹误.在编写象 scheduleTask() 这样的办法时,极端简单 忘掉用防备办法复制日期参数.假如忘掉这样做,您就制造了一个难以捕捉的错 误,这个错误不会即刻显现出来,并且当它表露时人们要花较长的时间才会捕捉 到.不变的 Date 类不大概发生这类错误.

固有的线程安全

大大都的线程安全问题发生在当多个线程正在试图并发地改正一个对象的状 态(写-写冲突)时,或当一个线程正试图拜候一个对象的状况,而另一个线程 正在改正它(读-写冲突)时.要避免这样的冲突,必须同步对同享对象的拜候 ,以便在对象处于不一致状况时别的线程不能拜候它们.精确地做到这一点会很 难,需求大量文档来确保精确地扩大程序,还大概对性能产生不利后果.只要正 确构造了不变对象(这意味着不让对象引用从构造函数中转义),就使它们免除 了同步拜候的要求,因为无法更改它们的状况,从而就不大概存在写-写冲突或 读-写冲突.

不用同步就可以安闲地在线程间同享对不变对象的引用,可以极大地简化编写 并发程序的历程,并削减程序大概存在的潜在并发错误的数目.

在恶意运行的代码眼前是安全的

把对象当作参数的办法不该变更那些对象的状况,除非文档明确阐明可以这 样做,大概实际上这些办法具有该对象的全部权.当我们将一个对象传送给普通 办法时,普通不但愿对象返回时已被更改.但是,利用可变对象时,完好会是这 样的.假如将 java.awt.Point 传送给诸如 Component.setLocation() 的办法 ,根本不会禁止 setLocation 改正我们传入的 Point 的位置,也不会禁止 setLocation 存储对该点的引用并稍后在另一个办法中更改它.(当然, Component 不这样做,因为它不鲁莽,但是并非全部类都那么客气.)目前, Point 的状况已在我们不知道的情形下更改了,后来果具有潜在危险 ― 当点实 际上在另一个位置时,我们仍认为它在本来的位置.但是,假如 Point 是不变 的,那么这种恶意的代码就不能以如此令人混乱而危险的办法改正我们的程序状 态了.


  以上是“Java理论与实践: 变还是不变?[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .