国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用Java Annotations管理對象生命周期

2019-11-18 10:46:27
字體:
來源:轉載
供稿:網友

  摘要

  java Annotations主要用來標注dePRecated的代碼。在這篇文章中,它們用來把方法調用的控制權移交給一個輕量級框架中負責處理一系列方法調用的組件。因此,正確的初始化和設置等操作被委派給客戶端應用而不是類,以做到設置和控制都可以調整。
 
  對于開發者來說,復雜的應用通常有很多初始化問題需要處理。許多不同的步驟無非是建立面板,配置服務之類。而這些事情的難點在于,有一些步驟需要重復,另一些則不需要。把這種治理問題交給類自己處理是非常麻煩的,因為邏輯可能會變化。另外,現代軟件設計強調分離職責。簡單來說,我們的目的是把做什么和怎么做分離開來。

  這篇文章展示給大家如何使用 Annotations來做初始化控制,這種做法超越了簡單的標注。它介紹了一個小的API,可以用它來開發你自己的“phaseable” 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。

  Phaser

  主要處理類也許應該被稱為Phaser。(喂,我們不都挺喜歡星際旅行嗎?)它執行全部的phase,并且為用戶提供簡單的監視機制。這個類的實現并不包含在這篇文章里,當然,你可以從資源找到框架代碼的下載。

  一個Phaser擁有一個實現了一些具體的PhasedXxxx接口并且治理phase調用的對象。
假設我們有一個像這樣的MyMask類:
public class MyMask implements PhasedMask {

   @Phase(index = 0)
   public void construct() {
      // Do the layout
   }

   @Phase(index = 1)
   public void initialize() {
      // Fill the mask with data
   }

   @Phase(index = 2)
   public void activate() {
      // Activate the listeners and allow the user to interact with the mask
   }
  
   // Business code

}



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜新| 东乌珠穆沁旗| 沙田区| 广河县| 额尔古纳市| 肇源县| 淳安县| 长岭县| 尼玛县| 西和县| 宁海县| 弥勒县| 太仓市| 江都市| 江西省| 晋州市| 和政县| 日土县| 芒康县| 长汀县| 齐齐哈尔市| 夏津县| 鹤岗市| 安康市| 江门市| 德惠市| 靖西县| 运城市| 仁寿县| 油尖旺区| 巨野县| 安龙县| 阿图什市| 黔江区| 米林县| 嘉祥县| 临汾市| 梓潼县| 太仆寺旗| 昭通市| 来凤县|