2007年02月
http://java.sun.com/developer/technicalArticles/J2SE/constraints/annotations.html
以上连接的这片文章resources提供了框架类的源代码和使用的一些方法,
没有提供一个实例,看着类文档才写出了下面这个真正的测试实例。
阅读全文>
发表于 @ 2007年02月28日 17:30:00|评论(loading...)|编辑
读了网上广为流传的annotation高级应用,发现其中的apt应用有点让人难以理解, 于是又去读 http://java.sun.com/j2se/1.5.0/docs/guide/apt/GettingStarted.html, 还是很难理解,annotation高级应用基本上成了sun这片文章的翻译,做了一把实验, 总结了以下,终于有点明白他的作用了。 文章上说,使用APT主要目的是简化开发者的工作量,因为APT可以在编译程序源代码 的同时,生成一些附属文件(比如源文件、类文件、程序发布描述文字等),这些附属 文件的内容也都是与源代码相关的。我觉得这其实主要是annotation的功劳, apt只是annotation处理的一种框架,可以省去很多自己处理annotation 时需要写的代码。 阅读全文>
发表于 @ 2007年02月28日 17:12:00|评论(loading...)|编辑
系统在变更后,有时需要维护太多的修改,既要修改源代码文件,又要更改配置中的相关内容,
由于开发者的疏忽,往往带来许多修改的不一致性(因为代码维护者不一定是代码开发者,即便是
开发者,由于系统庞大,在一定的时间以后,也难以清楚地记得代码与配置之间的相关性,需要清
晰的文档去恢复记忆),Annotation的目的主要是减少源代码和配置文件中的重复,增强系统的一
致性,以免修改了配置忘了修改代码。
阅读全文>
发表于 @ 2007年02月26日 10:59:00|评论(loading...)|编辑
以下是对JUnit实践的一个很好的总结,信息来源于一些比较权威的JUnit书籍和网上资料。这里集合如下:阅读全文>
发表于 @ 2007年02月12日 12:02:00|评论(loading...)|编辑
五 command模式
我觉得这跟observer模式有点相像,本来命令的调用者是在调用方法里直接执行命令
接收者的动作的,这里使用命令接口来对这个执行请求进行了封装,解耦了命令执行者和
命令接收者。java的swing菜单都是command模式。命令调用者调用的是菜单命令,而菜单
命令再去调用命令的接收者的相应动作,菜单命令实现了命令接口。阅读全文>
发表于 @ 2007年02月12日 11:58:00|评论(loading...)|编辑
我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有
源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办? 使用Adapter,将一个类的接口转换成客
户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。阅读全文>
发表于 @ 2007年02月12日 00:25:00|评论(loading...)|编辑
模式的功能:最大程度地用抽象消除类之间的耦合关系,并且让类各司其职,防止功能重迭,提高可
重用性。
好的面向对象的设计,就是能够最大程度地消除类与类之间的依赖,提高系统的可扩展性、灵活性,
所以好的面向对象设计,必须符合一些原则,如开闭原则,DIP原则等等,而模式是实践这些原则的
惯用方法,下面谈谈我对模式的理解。
首先谈谈创建对象时使用到的一些模式,即创建模式。
Factory模式
面向对象缺少不了对象,如果有大量对象生成,对象生产的代码原来分布在程序的各个角落,而且
对象可能是通过构造函数生成,也可能通过类名反射生成,假如要对生产过程或者生产出来的对象加一些控制,
必须要修改所有生成对象的代码,为了体现集中控制,并减少其他类对对象生成的依赖,专门开辟
工厂用来生成对象,封装对象的生成过程。
Singleton模式
有时候一个类如果在内存中有多个实例,而这些实例只是实现相同的功能,状态也完全一样,这时就可以
考虑使用singleton来节省内存。例如阅读全文>
发表于 @ 2007年02月11日 12:02:00|评论(loading...)|编辑
servlet的测试一般来说需要容器的支持,不是像通常的java类的junit测试一样简单, 下面通过对HelloWorld代码的测试阐述了几种servlet测试方法。一.使用HttpUnit测试二 使用cactus测试三 使用Jetty作为嵌入式容器测试servlet.四 使用mock对象,此处使用easymock阅读全文>
发表于 @ 2007年02月10日 22:13:00|评论(loading...)|编辑
使用依赖注入的主要好处就是能够消除MovieLister对具体实现MovieFinder的依赖。这允许我把Movielister给朋友并让他们根据自身环境情况注入相应的实现。注入并不是解除依赖关系的唯一方法,还有一种方法也可以解除依赖关系,那就是使用服务定位器。阅读全文>
发表于 @ 2007年02月10日 20:20:00|评论(loading...)|编辑
当这些轻量级容器的作者提及这些容器是如何有用是因为他们实现了控制反转的时候,我就觉得很迷惑,控制反转只是容器的一个普通特征,因为实现了控制反转而说这些轻量级容器是如何与众不同就好像有人说我的汽车有轮子,所以我的汽车很特别一样。 问题是这些容器反转了那方面的控制?我第一次遇到控制反转是在用户界面的设计上,早期的用户界面是由应用程序来控制的,你预先设计一系列命令如:“输入姓名”,“输入地址”;应用程序将逐条输出提示信息并接受你对每一条信息给出的应答。而采用了图形的用户界面后,界面框架将负责运行一个主循环,你的应用程序只是提供针对屏幕的事件处理。这里程序的控制被反转了,不再需要你的应用程序来控制,而是由框架来控制。 对于这些新生的容器,反转就是关于“容器如何定位一个插件的具体实现”,在我以上的例子中,lister通过直接实例化来定位一个finder的实现。这种办法使得finder不能成为一个插件,因为finder不是在运行时插入应用程序的,这些容器提供的办法就是确保插件用户遵循一些约定,只要遵守这些约定,一个独立的配置模块就可以向应用程序注射入lister的具体实现。阅读全文>
发表于 @ 2007年02月06日 16:57:00|评论(loading...)|编辑