首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 核心技术 >> 高级编程 >> 正文

使用Java Annotations来管理对象生命周期

 对于开发者来说,复杂的应用通常有很多初始化问题需要处理。许多不同的步骤无非是建立面板,配置服务之类。而这些事情的难点在于,有一些步骤需要重复,另一些则不需要。把这种管理问题交给类自己处理是非常麻烦的,因为逻辑可能会变化。另外,现代软件设计强调分离职责。简单来说,我们的目的是把做什么和怎么做分离开来。
          Annotations

          Annotations是J2SE 5.0引入的新语言特性。通常, Annotations允许开发者用一种跟运行代码无关的次要信息来标注类,方法以及成员。这样就可以使用类似评价的 Annotations,比如“好方法”、“坏方法”,或者更详细一些,“不推荐的方法”、“覆写的方法”。这些用法的可能性是无穷的。不过请注意,方法或类跟标注实际可能不相关,比如“不推荐的”。如果想知道关于 Annotations的更多详细讨论,请阅读Java 5.0 Tiger: A Developer's Notebook。

          因为 Annotations可以用来描述用例或者实体比如方法和类的意思,所以这是一种语法棒棒糖。反过来,这些附加信息也可以被其他东西(比如框架)用于各种各样的动作,比如生成文档(Javadoc),或者像这里讨论的,作为一种特殊内容来控制行为,比如对象的生命周期。

          生命周期管理

          生命周期管理通常发生在中间件环境中,比如应用服务器。这种思想是把对象的创建、使用以及销毁跟对象本身分开。例如在一个发布不同服务的应用服务器中,它通常不关心所请求的特殊服务(译注:此处的意思应该是应用服务器对所有请求都一视同仁),调用服务的机制或多或少的采用了同一种方案。这取决于应用的状态,呼叫者以及其他参数,一些必要的变量,但是在一个易于管理的环境中,基本的算法通常是一系列操作的顺序链。在Java客户端应用中,必须处理mask的显示,或者form允许用户输入或修改数据。

          示例问题

          在Java应用中,mask通常用于数据收集以及在CRUD(create, read, update, delete)周期中处理数据。用户可以修改、删除或者新增加一些数据。跟一个简单的商务问题一样,我们需要管理在客户端应用中如何显示mask。这样,我们把显示从操作链中分离了出来,像下面这样:

          1.创建:mask在这一状态中最好只安排一次。

          2.初始化:在这一状态,数据从文件和数据库等地方找回,并填充到mask的字段中。

          3.激活:这里,用户放弃对mask的控制。

          在现实中,涉及到很多方面:访问、验证、控制依赖等等。

          Phases

          在这篇讨论中,我提到了每一步操作的phase,基本思想非常简单:我们把类方法标注成操作链中的phases,然后把这些方法的调用交给服务(框架)来做。实际上,这种方法并不仅限于生命周期管理。它可以用做商务流程中所有调用的控制机制。

          我们使用的 Annotations简单的命名为Phase,我们使用它来把一个方法标注成操作链的一部分。在下面的代码里,你可以看到 Annotations的声明与接口很接近。

          @Retention(RetentionPolicy.RUNTIME)

          @Target({ElementType.METHOD})

          public @interface Phase {

          int index();

          String displayName() default "";}

          我们简单看一下代码。在头两行,你看到 Annotations跟另外两个 Annotations一起使用。刚看上去时,这有点混乱,但是这两行很简单的就指定了 AnnotationsPhase只允许并且应该保留到编译后。之所以增加这两个 Annotations,是因为有些 Annotations可能只会在编译期间被使用,并且可能指向类或者成员。

          @interface是一个 Annotations的标准描述。在接下来的代码中,index和displayName??不只声明了一个成员,还声明了一个方法??也是Java的新语法。如果没提供初始值的话, displayName将被赋予了一个空字符串作为初始值,同时这个displayName能够被用来作为监测用途,叫做progress bar. index()是必须的,它告诉框架这些phase可以被缺省的执行。

          像我早先说的那样,我们应该把这个逻辑从对象中分离出来,所以我们定义了一个必须实现的接口以用于调用管理。这个接口可以被一个客户端对象实现。为了达到管理的目的,我们定义了一个通用的标记接口,所有的“phaseable”接口必须从这里继承,这样框架就可以通过一个唯一的访问点来管理类。

          public interface Phased {}

          这个接口的具体实现会看起来像下面的代码那样。这里,接口定义了一个mask,或者一个form,它们包含几个操作,这些操作必须像上面的描述那样被定义。

                 public interface PhasedMask extends Phased {       @Phase(index=0)

          public void construct();

          @Phase(index=1)

          public void initialize();

          @Phase(index=2,displayName="Activating...")

          public void activate();}

          你可以看到如何使用 Annotations。它写在方法声明之前,并使用一个介绍性的@sign,它的属性index需要提供圆括号。请注意,因为 Annotations并不是一个Java声明,所以结尾不能出现分号。现在,我们需要一个类来来把这些东西联结起来,并且试试我们刚才定义的phase。

 

[1] [2] 下一页

【责编:landy】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航