CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

您现在的位置: IT专家网 > Web服务子站 > 技巧

进阶:Java中用动态代理类实现记忆功能

作者: wwty ,  出处:赛迪网, 责任编辑: 李春禹, 
2007-12-27 13:17
  最简单直接的方法来缓存返回值可以通过修改这个类来实现:添加一个map来保存之前计算得到的值,如下:  import java.util.hashmap;通过使用decorator模式,要分开计算代码和缓存代码是很容易的.首先,定义一个接口,里面定义基本的方法.

 import java.util.hashmap;
  public class pibinarydigitscalculator {
  private hashmap cache = new hashmap();
  public synchronized byte calculatebinarydigit(
  final int n) {
  final integer n = new integer(n);
  byte b = (byte) cache.get(n);
  if (b == null) {
  byte b = runbbpalgorithm(n);
  cache.put(n, new byte(b));
  return b;
  } else {
  return b.bytevalue();
  }
  }
  private byte runbbpalgorithm(final int n) {
  // lengthy routine goes here ...
  }
  }

  calculatebinarydigit 方法首先会检查hashmap里面是否缓存了这个关键字-参数n,如果找到了,就直接返回这个值.否则,就会进行这个冗长的计算,并将结果保存到缓存里面.在添加进hashmap的时候,在原始类型和对象之间还要进行小小的转换.

  尽管这个方法是可行的,但是有几个缺点.首先,进行缓存的代码和正常的算法代码不是显著分开的.一个类,不仅负责进行计算,也要负责进行维护缓存数据.这样,要进行一些测试就会显得很困难.比如,不能写一个测试程序来测试这个算法持续地返回相同的值,因为,从第二次开始,结果都是直接从cache中获得了.

  其次,当缓存代码不再需要,移除它会变得困难,因为它和算法块地代码是紧密结合在一起的.所以,要想知道缓存是否带来了很高的效率提升也是很困难的,因为不能写一个测试程序是和缓存数据分开的.当你改进了你的算法,缓存有可能失效-但是这个时候你并不知道.

  第三,缓存代码不能被重用.尽管代码遵从了一个普通的模式,但是都是在一个类- pibinarydigitscalculator里面.

  前面两个问题都可以通过构造一个缓存包装器来解决.

  缓存包装器

  通过使用decorator模式,要分开计算代码和缓存代码是很容易的.首先,定义一个接口,里面定义基本的方法.  

public interface binarydigitscalculator {
  public byte calculatebinarydigit(final int n);
  }
  然后定义两个实现,分别负责两个任务:
  public class pibinarydigitscalculator
  implements binarydigitscalculator {
  public byte calculatebinarydigit(final int n) {
  return runbbpalgorithm(n);
  }
  private byte runbbpalgorithm(final int n) {
  // lengthy routine goes here ...
  }
  }
  import java.util.hashmap;
  public class cachingbinarydigitscalculator implements
  binarydigitscalculator {
  private binarydigitscalculator binarydigitscalculator;
  private hashmap cache = new hashmap();
  public cachingbinarydigitscalculator(
  binarydigitscalculator calculator) {
  this.binarydigitscalculator = calculator;
  }
  public synchronized byte calculatebinarydigit(int n) {
  final integer n = new integer(n);
  byte b = (byte) cache.get(n);
  if (b == null) {
  byte b =
  binarydigitscalculator.calculatebinarydigit(n);
  cache.put(n, new byte(b));
  return b;
  } else {
  return b.bytevalue();
  }
  }
  }

共3页。 9 1 2 3 :

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅

       
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i