仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 448|回复: 10
打印 上一主题 下一主题

[学习教程] JAVA网页设计JAVA顶用静态代办署理类完成影象功效

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
手机用到的是用j2me所编出来的小程序。静态影象是衍生自Lisp,Python,和Perl等历程性言语的一种计划形式,它能够对上次的盘算了局举行影象。一个完成了影象功效的函数,带有显式的cache,以是,已盘算过的了局就可以间接从cache中取得,而不必每次都举行盘算.
影象能明显的提拔年夜盘算量代码的效力.并且是一种可重用的计划.
本文论述了在Java中利用这一形式的办法,并供应了一个能够供应上述功效的"影象类":
Foofoo=(Foo)Memoizer.memoize(newFooImpl());
这里,Foo是一个接口,它含有的办法是必要影象的.FooImpl是Foo的一个完成.foo是Foo的一个援用.办法与FooImpl基础不异,区分在于Foo前往的值,会被缓存起来.单个影象类的长处在于为任何类增加影象功效是很复杂的:界说一个包括必要影象的办法的接口,然后挪用memoize来完成一个实例.

为了了解影象类是怎样完成的,我们将分几步来注释.起首,我注释一下为什么缓存可以在必要它的类中完成.然后,我测试一下怎样为一个特定的类增加缓存包装器.最初,我注释一下怎样才干使得一个缓存包装器可以通用于恣意的类.

为年夜盘算量的程序增加缓存
作为一个年夜盘算量程序的例子,我们思索PiBinaryDigitsCalculator这个例子-盘算二进制数据pi.唯一的public办法calculateBinaryDigit带有一个参数:整数n,代表必要准确到的位数.比方,1000000,将会前往小数点后的一百万位,经由过程byte值前往-每位为0大概1.(算法能够参考:http://www.cecm.sfu.ca/~pborwein/PAPERS/P123.pdf)
publicclassPiBinaryDigitsCalculator{
/**
*Returnsthecoefficientof2^ninthebinary
*expansionofpi.
*@paramnthebinarydigitofpitocalculate.
*@throwsValidityCheckFailedExceptionifthevalidity
*checkfails,thismeanstheimplementationisbuggy
*ornistoolargeforsufficientprecisiontobe
*retained.
*/
publicbytecalculateBinaryDigit(finalintn){
returnrunBBPAlgorithm(n);
}

privatebyterunBBPAlgorithm(finalintn){
//Lengthyroutinegoeshere...
}

}

最复杂间接的办法来缓存前往值能够经由过程修正这个类来完成:增加一个Map来保留之前盘算失掉的值,以下:
importjava.util.HashMap;

publicclassPiBinaryDigitsCalculator{

privateHashMapcache=newHashMap();

publicsynchronizedbytecalculateBinaryDigit(
finalintn){

finalIntegerN=newInteger(n);
ByteB=(Byte)cache.get(N);
if(B==null){
byteb=runBBPAlgorithm(n);
cache.put(N,newByte(b));
returnb;
}else{
returnB.bytevalue();
}
}

privatebyterunBBPAlgorithm(finalintn){
//Lengthyroutinegoeshere...
}
}


calculateBinaryDigit办法起首会反省HashMap内里是不是缓存了这个关头字-参数n,假如找到了,就间接前往这个值.不然,就会举行这个冗杂的盘算,并将了局保留到缓存内里.在增加进HashMap的时分,在原始范例和对象之间还要举行小小的转换.
只管这个办法是可行的,可是有几个弱点.起首,举行缓存的代码和一般的算法代码不是明显分隔的.一个类,不但卖力举行盘算,也要卖力举行保护缓存数据.如许,要举行一些测试就会显得很坚苦.好比,不克不及写一个测试程序来测试这个算法延续地前往不异的值,由于,从第二次入手下手,了局都是间接从cache中取得了.
其次,当缓存代码不再必要,移除它会变得坚苦,由于它和算法块地代码是严密分离在一同的.以是,要想晓得缓存是不是带来了很高的效力提拔也是很坚苦的,由于不克不及写一个测试程序是弛缓存数据分隔的.当你改善了你的算法,缓存有大概生效-可是这个时分你其实不晓得.
第三,缓存代码不克不及被重用.只管代码服从了一个一般的形式,可是都是在一个类-PiBinaryDigitsCalculator内里.

后面两个成绩都能够经由过程机关一个缓存包装器来办理.

缓存包装器
经由过程利用Decorator形式,要分隔盘算代码弛缓存代码是很简单的.起首,界说一个接口,内里界说基础的办法.
publicinterfaceBinaryDigitsCalculator{

publicbytecalculateBinaryDigit(finalintn);
}



然后界说两个完成,分离卖力两个义务:
publicclassPiBinaryDigitsCalculator
implementsBinaryDigitsCalculator{

publicbytecalculateBinaryDigit(finalintn){
returnrunBBPAlgorithm(n);
}

privatebyterunBBPAlgorithm(finalintn){
//Lengthyroutinegoeshere...
}

}

importjava.util.HashMap;

publicclassCachingBinaryDigitsCalculatorimplements
BinaryDigitsCalculator{

privateBinaryDigitsCalculatorbinaryDigitsCalculator;
privateHashMapcache=newHashMap();

publicCachingBinaryDigitsCalculator(
BinaryDigitsCalculatorcalculator){
this.binaryDigitsCalculator=calculator;
}

publicsynchronizedbytecalculateBinaryDigit(intn){
finalIntegerN=newInteger(n);
ByteB=(Byte)cache.get(N);
if(B==null){
byteb=
binaryDigitsCalculator.calculateBinaryDigit(n);
cache.put(N,newByte(b));
returnb;
}else{
returnB.bytevalue();
}
}
}


这是很之前的完成PiBinaryDigitsCalculator的一种复杂的refactored版本.CachingBinaryDigitsCalculator包装了BinaryDigitsCalculator句柄,并增添了缓存,供calculateBinaryDigit的办法挪用.这类办法进步了代码的可读性与可保护性.用户不克不及间接利用BinaryDigitsCalculator接口来完成算法,以是,假如必要封闭缓存块,将是很简单完成的.
另有,符合的测试程序很简单写出来.好比,我们写一个假的BinaryDigitsCalculator完成,每次calculateBinaryDigit被挪用,付与不异的参数,前往分歧的值.如许,我们就可以测试缓存是不是事情了,由于假如每次都前往不异的值,则证实缓存是一般事情了.这类测试在之前那种复杂的完成是不成能的.

还得说上一点,就java本质而言,是面相对象的,但是你有没有发现,java也不全是,比如说基本类型,int,那他就是整型而不是对象,转换类型是还得借助包装类。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-19 16:10:56 | 只看该作者
是一种为 Internet发展的计算机语言
小女巫 该用户已被删除
板凳
发表于 2015-1-21 10:41:39 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
地板
发表于 2015-1-22 09:06:34 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
分手快乐 该用户已被删除
5#
发表于 2015-2-6 17:22:59 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
冷月葬花魂 该用户已被删除
6#
发表于 2015-2-10 00:45:23 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
第二个灵魂 该用户已被删除
7#
发表于 2015-2-21 10:15:33 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-3 19:48:55 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
爱飞 该用户已被删除
9#
发表于 2015-3-8 11:59:47 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
只想知道 该用户已被删除
10#
发表于 2015-3-15 22:27:20 | 只看该作者
是一种突破用户端机器环境和CPU
再现理想 该用户已被删除
11#
发表于 2015-3-22 17:10:35 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 17:33

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表