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

"一成不变"的弊端(java)[Java编程]

赞助商链接



  本文“"一成不变"的弊端(java)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
从表面看,不变类的成立仿佛是一个好筹划.但是,一旦真的需求那种新范例的一个改正的对象,就必须辛劳地举行新对象的成立工作,同时还有大概触及更频繁的垃圾汇集.对有些类来说,这个问题并非很大.但对其他类来说(比方String类),这一筹划的代价显得太高了.
为办理这个问题,我们可以成立一个“同志”类,并使其可以改正.今后只要触及大量的改正工作,便可换为利用能改正的同志类.完事今后,再切换回不可变的类.
因此,上例可改成下面这个模样:
//: Immutable2.java
// A companion class for making changes
// to immutable objects.

class Mutable {
  private int data;
  public Mutable(int initVal) {
    data = initVal;
  }
  public Mutable add(int x) { 
    data += x;
    return this;
  }
  public Mutable multiply(int x) {
    data *= x;
    return this;
  }
  public Immutable2 makeImmutable2() {
    return new Immutable2(data);
  }
}

public class Immutable2 {
  private int data;
  public Immutable2(int initVal) {
    data = initVal;
  }
  public int read() { return data; }
  public boolean nonzero() { return data != 0; }
  public Immutable2 add(int x) { 
    return new Immutable2(data + x);
  }
  public Immutable2 multiply(int x) {
    return new Immutable2(data * x);
  }
  public Mutable makeMutable() {
    return new Mutable(data);
  }
  public static Immutable2 modify1(Immutable2 y){
    Immutable2 val = y.add(12);
    val = val.multiply(3);
    val = val.add(11);
    val = val.multiply(2);
    return val;
  }
  // This produces the same result:
  public static Immutable2 modify2(Immutable2 y){
    Mutable m = y.makeMutable();
    m.add(12).multiply(3).add(11).multiply(2);
    return m.makeImmutable2();
  }
  public static void main(String[] args) {
    Immutable2 i2 = new Immutable2(47);
    Immutable2 r1 = modify1(i2);
    Immutable2 r2 = modify2(i2);
    System.out.println("i2 = " + i2.read());
    System.out.println("r1 = " + r1.read());
    System.out.println("r2 = " + r2.read());
  }
} ///:~
和平常一样,Immutable2包含的办法保存了对象不可变的特点,只要触及改正,就成立新的对象.完成这些操作的是add()和multiply()办法.同志类叫作Mutable,它也含有add()和multiply()办法.但这些办法可以改正Mutable对象,而不是新建一个.除此以外,Mutable的一个办法可用它的数据产生一个Immutable2对象,反之亦然.
两个静态办法modify1()和modify2()揭暴露得到一样后果的两种差别办法.在modify1()中,全部工作都是在Immutable2类中完成的,我们可看到在进程中成立了四个新的Immutable2对象(并且每次重新分配了val,前一个对象就成为垃圾).
在办法modify2()中,可看到它的第一个行动是获得Immutable2 y,然后从中生成一个Mutable(近似于前面对clone()的调用,但这一次成立了一个差别范例的对象).随后,用Mutable对象举行大量改正操作,同时用不着新建很多对象.最后,它切换回Immutable2.在这里,我们只成立了两个新对象(Mutable和Immutable2的后果),而不是四个.
这一办法分外合适在下述场所利用:
(1) 需求不可变的对象,并且
(2) 常常需求举行大量改正,大概
(3) 成立新的不变对象代价太高
  以上是“"一成不变"的弊端(java)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • XP系统拜候局域网计算机时提醒"回绝拜候"的办理办法
  • Windows 8 系统提醒"已禁用 IME"会对系统利用有什么影响
  • Windows 8 中找回"便笺"小工具和程序的办法(图)
  • Windows 8 中"便笺"小工具和程序不见了若何处理
  • IE浏览器弹出对话框"您计算机某程序已破坏"怎么办理?
  • 办理内存不能为"read"指令00000000*0的问题
  • Windows7的优化本领之启动"高性能"设置(图文教程)
  • Win7安装VirtualBox提醒"Installation failed!Error:系统找不到指定的途径"的缘由及
  • 巧用Win7的"属性"功效 办理常用小问题的办法
  • 关闭迅雷"XLServicePlatform"服务 避免招致Win8假死的办法
  • Win7中无法成立文件‘新建 库.library-ms’文件系统错误(16389)"若何办理
  • SQL Server 2008 Express 安装或卸载时提醒"重启计算机失利"的办理办法
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

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