知识大全 用Java Annotations管理对象生命周期

Posted

篇首语:常勤精进,譬如水长流,则能穿石。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Java Annotations管理对象生命周期相关的知识,希望对你有一定的参考价值。

用Java Annotations管理对象生命周期  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

摘要  Java Annotations主要用来标注deprecated的代码 在这篇文章中 它们用来把方法调用的控制权移交给一个轻量级框架中负责处理一系列方法调用的组件 因此 正确的初始化和设置等操作被委派给客户端应用而不是类 以做到设置和控制都可以调整    对于开发者来说 复杂的应用通常有很多初始化问题需要处理 许多不同的步骤无非是建立面板 配置服务之类 而这些事情的难点在于 有一些步骤需要重复 另一些则不需要 把这种管理问题交给类自己处理是非常麻烦的 因为逻辑可能会变化 另外 现代软件设计强调分离职责 简单来说 我们的目的是把做什么和怎么做分离开来   这篇文章展示给大家如何使用 Annotations来做初始化控制 这种做法超越了简单的标注 它介绍了一个小的API 可以用它来开发你自己的 phaseable Annotations 或者在这种新特性上给你提供一些灵感   Annotations  Annotations是J SE 引入的新语言特性 通常 Annotations允许开发者用一种跟运行代码无关的次要信息来标注类 方法以及成员 这样就可以使用类似评价的 Annotations 比如 好方法 坏方法 或者更详细一些 不推荐的方法 覆写的方法 这些用法的可能性是无穷的 不过请注意 方法或类跟标注实际可能不相关 比如 不推荐的 如果想知道关于 Annotations的更多详细讨论 请阅读Java Tiger: A Developer s Notebook   因为 Annotations可以用来描述用例或者实体比如方法和类的意思 所以这是一种语法棒棒糖 反过来 这些附加信息也可以被其他东西(比如框架)用于各种各样的动作 比如生成文档(Javadoc) 或者像这里讨论的 作为一种特殊内容来控制行为 比如对象的生命周期   生命周期管理  生命周期管理通常发生在中间件环境中 比如应用服务器 这种思想是把对象的创建 使用以及销毁跟对象本身分开 例如在一个发布不同服务的应用服务器中 它通常不关心所请求的特殊服务(译注 此处的意思应该是应用服务器对所有请求都一视同仁) 调用服务的机制或多或少的采用了同一种方案 这取决于应用的状态 呼叫者以及其他参数 一些必要的变量 但是在一个易于管理的环境中 基本的算法通常是一系列操作的顺序链 在Java客户端应用中 必须处理mask的显示 或者form允许用户输入或修改数据  示例问题  在Java应用中 mask通常用于数据收集以及在CRUD(create read update delete)周期中处理数据 用户可以修改 删除或者新增加一些数据 跟一个简单的商务问题一样 我们需要管理在客户端应用中如何显示mask 这样 我们把显示从操作链中分离了出来 像下面这样 创建 mask在这一状态中最好只安排一次 初始化 在这一状态 数据从文件和数据库等地方找回 并填充到mask的字段中 激活 这里 用户放弃对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= )   public void construct();   @Phase(index= )   public void initialize();   @Phase(index= displayName= Activating )   public void activate();

  你可以看到如何使用 Annotations 它写在方法声明之前 并使用一个介绍性的@sign 它的属性index需要提供圆括号 请注意 因为 Annotations并不是一个Java声明 所以结尾不能出现分号 现在 我们需要一个类来来把这些东西联结起来 并且试试我们刚才定义的phase   Phaser  主要处理类也许应该被称为Phaser (喂 我们不都挺喜欢星际旅行吗?)它执行全部的phase 并且为用户提供简单的监视机制 这个类的实现并不包含在这篇文章里 当然 你可以从资源找到框架代码的下载   一个Phaser拥有一个实现了一些具体的PhasedXxxx接口并且管理phase调用的对象 假设我们有一个像这样的MyMask类

  public class MyMask implements PhasedMask    @Phase(index = )   public void construct()       // Do the layout       @Phase(index = )   public void initialize()       // Fill the mask with data      @Phase(index = )   public void activate()       // Activate the listeners and allow the user to interact with the mask         // Business code

  现在 我们可以像下面那样调用这些PhasedMask方法

  Phaser phaser = new Phaser( phasedMask );phaser invokeAll();

  这样 方法construct() initialize()和activate()就都被调用了   那么我们如何控制phase呢?我们跳过构造阶段 因为当我们第二次调用phasedMask()时 并不需要再布置一次 本意是我们不需要construct()被调用多次 因为我们把这个方法用 索引标注 所以我们可以简单的跳过这个索引 并且告诉Phaser应该执行哪些phase

  Phaser phaser = new Phaser( phasedMask );phaser invoke( new int[] );

  这样就好了 不过不够清晰 谁会记得phase的索引实际代表什么?幸运的是 我们可以像下面这样写得详细一点

  Phaser phaser = new Phaser( phasedMask );phaser invoke( new String[] initialize activate );

  这里 我们使用从接口继承来的方法名 当然 如果需要的话 我们可以重新安排phase 所以 为了交换顺序 我们可以这样写

  Phaser phaser = new Phaser( phasedMask );phaser invoke( new String[] activate initialize );

  这个好象没什么意义 但是 当某个设置中一些phase是紧耦合的时 这种做法是有用的   因为我们在这里通过反射来调用方法 所以存在很多抛出异常的情况 Phaser会捕捉这些异常 并包装成所谓的PhaserException 所以 如果一个方法调用失败(比如是私有的) Phaser的invoke()方法会抛出一个包含着最初异常的PhaseException 如果对反射知之不多 请看边栏的 Notes on Reflection   你也许会给Phaser增加一个PhaseListener来观察里面发生了什么 并在漫长的phase调用过程中反馈给用户一些信息

  PhaseListener listener = new PhaseListener()    public void before( PhaseEvent e )       // This is called before the Phaser invokes a phase      public void after( PhaseEvent e )       // This is called after the Phaser has successfully invoked a phase   ; Phaser phaser = new Phaser( phasedMask );phaser addPhaseListener( listener );phaser invoke( new String[] initialize activate );

cha138/Article/program/Java/gj/201311/27452

相关参考

知识大全 用JAXB实现JAVA对象与XML文件的绑定

用JAXB实现JAVA对象与XML文件的绑定  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  用J

知识大全 消除对过期对象的引用

  Java比c++方便的一点就是java有自己的垃圾收集机制可以自动帮你收集垃圾但是这并非意味着使用java我们就不需要考虑内存管理了  这一点相信很多java程序员都是知道的就是当一个对象我们决定

知识大全 java中对于复杂对象排序的模型及其实现

  排序是编程中经常要碰到的问题如果只是一般的数据库数据那么我们完全可以用数据sql语言来排序但有的时候情况并不是这样在一些特殊情况下我们不得不自己在java中写一些排序而通常排序是一件让程序员非常恼

知识大全 Hibernate 3 Annotations 进阶

Hibernate3Annotations进阶  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘

知识大全 Groovy编程—Annotations的使用

Groovy编程—Annotations的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  从

知识大全 用句柄操纵对象

  每种编程语言都有自己的数据处理方式有些时候程序员必须时刻留意准备处理的是什么类型您曾利用一些特殊语法直接操作过对象或处理过一些间接表示的对象吗(C或C++里的指针)?  所有这些在Java里都得到

知识大全 java与模式笔记 - 合成模式

    合成模式:  合成模式把部分和整体的关系用树结构表示出来合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等对待    抽象构件角色:  这是一个抽象角色它给参加组合的对象规

知识大全 Hibernate Annotations 实战介绍

HibernateAnnotations实战介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!从h

知识大全 用Solstice Enterprise Manager建立Java网络管理应用程序

用SolsticeEnterpriseManager建立Java网络管理应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容

知识大全 Java:使用synchronized和Lock对象获取对象锁

Java:使用synchronized和Lock对象获取对象锁  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来