Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          [Jakarta Commons筆記] Commons Collections - Buffer組

          Posted on 2005-08-04 12:49 laogao 閱讀(2072) 評論(0)  編輯  收藏 所屬分類: On Java

           

          來看Buffer組。

           

          Buffer

          BlockingBuffer

          BoundedFifoBuffer

          PriorityBuffer

          UnboundedFifoBuffer

          BufferUtils

           

          Buffer是定義在org.apache.commons.collections包下面的接口,用于表示按一定順序除去成員對象的collection如隊列等。具體的實現(xiàn)類在org.apache.commons.collections.buffer包下可以找到。

           

          BufferUtils提供很多靜態(tài)/工具方法裝飾現(xiàn)有的Buffer實例,如將其裝飾成BlockingBuffer、執(zhí)行類型檢查的TypedBuffer、或者不可改變的UnmodifiableBuffer等等。

           

          最簡單直接的Buffer實現(xiàn)類是UnboundedFifoBuffer,提供先進先出的大小可變的隊列。而BoundedFifoBuffer則是對其大小進行了限制,是固定大小的先進先出隊列。BlockingBuffer要在多線程的環(huán)境中才能體現(xiàn)出它的價值,尤其是當我們需要實現(xiàn)某種流水線時這個BlockingBuffer很有用:每個流水線上的組件從上游的BlockingBuffer獲取數(shù)據(jù),處理后放到下一個BlockingBuffer中依次傳遞。BlockingBuffer的核心特色通俗點說就是如果你向它要東西,而它暫時還沒有的話,你可以一直等待直至拿到為止。PriorityBuffer則提供比一般的先進先出Buffer更強的控制力:我們可以自定義Comparator給它,告訴它怎么判定它的成員的先后順序,優(yōu)先級最高的最先走。

           

          為了方便和清晰的需要,我在這里只舉一個BoundedFifoBuffer,包裝成TypedBuffer,看看在具體的代碼中通常如何使用Buffer:(還是沿用上次的Book類)

           

          package sean.study.commons.collections;

           

          import java.util.Iterator;

           

          import org.apache.commons.collections.Buffer;

          import org.apache.commons.collections.BufferUtils;

          import org.apache.commons.collections.buffer.BoundedFifoBuffer;

          import org.apache.commons.lang.StringUtils;

           

          public class BufferUsage {

           

              public static void main(String[] args) {

                  demoBufferUsage();

              }

           

              public static void demoBufferUsage() {

           

                  System.out.println(StringUtils.center(" demoBagUsage ", 40, "="));

           

                  // data setup

                  Book book1 = new Book("Refactoring Workbook", "7-5083-2208-8", 29.8);

                  Book book2 = new Book("J2EE Design Patterns", "7-5083-3099-4", 45);

                  Book book3 = new Book("Agile Software Development", "7-5083-1503-0", 59);

                  Book book4 = new Book("Professional JSP", "7-5053-8005-2", 100);

           

                  // create a Buffer

                  Buffer buffer =

                      BufferUtils.typedBuffer(new BoundedFifoBuffer(3), Book.class);

                  buffer.add(book1);

                  buffer.add(book2);

                  buffer.add(book3);

                  Book removed = (Book) buffer.remove();

                  System.out.println("Removed:");

                  System.out.println(removed);

                  buffer.add(book4);

                 

                  // get items in buffer

                  for (int i = 0; i < 3; i++) {

                      System.out.println(buffer.get());

                      buffer.remove();

                  }

           

                  System.out.println(StringUtils.repeat("=", 40));

           

              }

           

          }

           

          以下是運行結果:

           

          ============= demoBagUsage =============

          Removed:

          sean.study.commons.collections.Book@e09713[

            name=Refactoring Workbook

            ISBN=7-5083-2208-8

            retailPrice=29.8

          ]

          Remaining:

          sean.study.commons.collections.Book@e09713[

            name=J2EE Design Patterns

            ISBN=7-5083-3099-4

            retailPrice=45.0

          ]

          sean.study.commons.collections.Book@47b480[

            name=Agile Software Development

            ISBN=7-5083-1503-0

            retailPrice=59.0

          ]

          sean.study.commons.collections.Book@19b49e6[

            name=Professional JSP

            ISBN=7-5053-8005-2

            retailPrice=100.0

          ]

          ========================================

           

          我們可以看到,Bufferaddremove方法分別添加新成員和刪除最先加入的成員。由于我們的Buffer定義為只能裝3Book類的實例,所以不論我們試圖加入其他類型的對象,或者加入超過3個,操作都將失敗。如果我們在遍歷時使用get()而不調用remove(),那么我們將得到3個相同的拷貝,而這正是我們期望的FIFO隊列的行為。假如你需要遍歷并保留數(shù)據(jù),可以使用標準的Iterator機制。

           

           

          主站蜘蛛池模板: 博湖县| 抚州市| 观塘区| 丹巴县| 万宁市| 黑山县| 万山特区| 安化县| 凤翔县| 平南县| 应用必备| 年辖:市辖区| 深州市| 天镇县| 祁门县| 西丰县| 清原| 舟曲县| 韶关市| 天长市| 徐水县| 米林县| 利川市| 长丰县| 平凉市| 清远市| 孙吴县| 永善县| 密山市| 通江县| 扎兰屯市| 鄂温| 苏尼特右旗| 苏尼特左旗| 丽江市| 特克斯县| 石楼县| 靖宇县| 余姚市| 沅陵县| 江北区|