來看Buffer組。
Buffer
BlockingBuffer
BoundedFifoBuffer
PriorityBuffer
UnboundedFifoBuffer
BufferUtils
Buffer是定義在org.apache.commons.collections包下面的接口,用于表示按一定順序除去成員對象的collection如隊列等。具體的實現類在org.apache.commons.collections.buffer包下可以找到。
BufferUtils提供很多靜態/工具方法裝飾現有的Buffer實例,如將其裝飾成BlockingBuffer、執行類型檢查的TypedBuffer、或者不可改變的UnmodifiableBuffer等等。
最簡單直接的Buffer實現類是UnboundedFifoBuffer,提供先進先出的大小可變的隊列。而BoundedFifoBuffer則是對其大小進行了限制,是固定大小的先進先出隊列。BlockingBuffer要在多線程的環境中才能體現出它的價值,尤其是當我們需要實現某種流水線時這個BlockingBuffer很有用:每個流水線上的組件從上游的BlockingBuffer獲取數據,處理后放到下一個BlockingBuffer中依次傳遞。BlockingBuffer的核心特色通俗點說就是如果你向它要東西,而它暫時還沒有的話,你可以一直等待直至拿到為止。PriorityBuffer則提供比一般的先進先出Buffer更強的控制力:我們可以自定義Comparator給它,告訴它怎么判定它的成員的先后順序,優先級最高的最先走。
為了方便和清晰的需要,我在這里只舉一個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
]
========================================
我們可以看到,Buffer的add和remove方法分別添加新成員和刪除最先加入的成員。由于我們的Buffer定義為只能裝3個Book類的實例,所以不論我們試圖加入其他類型的對象,或者加入超過3個,操作都將失敗。如果我們在遍歷時使用get()而不調用remove(),那么我們將得到3個相同的拷貝,而這正是我們期望的FIFO隊列的行為。假如你需要遍歷并保留數據,可以使用標準的Iterator機制。