你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Java专栏
跨越边界:浅谈Java模型以外的类型策略(4)
 
Dao myDataAccessObject = Dao.new(sessionFactory);

  问题是,这行代码是在编译时绑定的,这就太静态了。为了测试,您常常需要用其他东西,例如一个模拟的数据访问对象来替换会话工厂或数据访问对象。所以,您不必像前面那样硬编码这个例子,而是使用一个 Spring 之类的框架,以 XML 来配置项目,如下所示(摘自名为 petclinic 的 Spring Framework 例子):

<bean id="myDao" class="org.springframework.samples.petclinic.hibernate.HibernateClinic">
<property name="sessionFactory" ref="sessionFactory">
</bean>

  Spring 框架是目前 Java 社区中最重要、最有影响力的框架之一,因为它使您可以延迟绑定,并使系统主要元素之间的耦合性更为松散。而且,您不需要关心继承就可以去耦。在 Java 编程中,尤其是在编写越来越多的 POJO(plain old Java object)的时候,使用继承时必须特别小心,因为在 Java 语言中只有一次这样的机会。

  在动态语言,例如 Ruby 中,解决方案就截然不同。首先,我倾向于使用一个 mix-in 来实现持久性。所有关联只在 mix-in 中发现一次。可以把一个 mix-in 想像成一个接口,其背后有一个实现。换句话说,通过 mix-in,可以添加多个功能到同一个对象中,而不必使用多重继承。实际上,Active Record 通过继承一个公共基类来解决这个问题,这个公共基类混合了多种功能:

  class Pojo < ActiveRecord::Base

  在 Ruby 中,您不必关心继承,因为使用开放的类(允许动态添加功能)和模块(允许混入其他功能),您可以随意添加更多的功能到对象中。那么紧密耦合呢?如果您想按 Java 的方式实现该类,那么可以看到:

class MyClass
attr_accessor myDao #defines getters and setters for myDao
def initialize(session_factory)
myDao = Dao.new(session_factory)
end
...

  initialize() 方法中的代码看上去像一开始的属于禁忌的 Java 版本,因为它在编译时将数据访问对象绑定到会话工厂。但这是一种动态类型语言,所以不必把自己关在一个小天地里。为了测试,总可以动态地改变类的定义。您可以在之后打开已有的类:

class MyClass #not redefining the class; just opening the existing class
def myDao #redefine the getter for myDao
#do some work to generate the mock object
return myMockObject
end
end

  结束语

  从某种意义上讲,作为某种编程语言的用户,您就是那种语言的类型策略的奴隶。而作为一名 Java 程序员,您应该尽量用一种拥护类型的方式编写 Java 代码。最大限度地利用类型,并依靠社区来通过框架获得更好的元编程支持,而不是自己进行元编程,这些都是发挥自身优势的好方法。有很多 Java 框架都支持用于持久性(Hibernate 和 JDO)、事务(Spring 和 EJB)、模型-视图-控制器(WebFlow 和 RIFE)以及编程模型(AspectJ)的元编程。

  但是有时候需要放弃您所选择的语言的类型,不管您是在编写需要附加描述以获得更好可读性的代码,还是试图延迟类型绑定,都可以这样。Java 语言非常强大,您可以利用很多现成的项目:

  Spring 框架使您可以将绑定推迟到运行时,并提供动态类型语言的很多功能。Spring 特别适合于添加功能到 POJO,运行时配置,以及绕过 Java 语言的类型限制。

  AspectJ 是面向方面编程模型在 Java 平台上的一种实现。AspectJ 使您可以引入横切关注点,而不必引入额外的语法,这种技术还使您可以克服 Java 语言的静态特性。

  Hibernate 项目和 Java Persistence API (JPA) 使您可以添加持久性到 POJO 中,同样也不必改变底层的类型。

  XML 让您可以同时表达数据和应用程序配置。很多框架使用 XML 来克服 Java 语言的类型限制。

  您还有一个选择。通过理解其他语言中的类型策略,可以识别不适合 Java 策略的问题。当需要访问 Java 平台 而不是 Java 语言 时,可以使用其他语言的 JVM 实现。

(编辑:aniston)

  推荐精品文章

·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录
·2023年4月目录 
·2023年3月目录 
·2023年2月目录 
·2023年1月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089