先来看Bag组。

 

Bag

HashBag

BagUtils

 

Bag是在org.apache.commons.collections包中定义的接口,它extends java.util.Collection,而它的实现类都被放在下面的bag包中。之所以有这样一组类型,是因为我们有时候需要在Collection中存放多个相同对象的拷贝,并且需要很方便的取得该对象拷贝的个数。需要注意的一点是它虽然extends Collection,但是如果真把它完全当作java.util.Collection来用会遇到语义上的问题,详细信息参考Javadoc。

 

HashBag是Bag接口的一个标准实现。而BagUtils提供一组static的方法让调用者获取经过不同装饰后的Bag实例。

 

还是举例子来看:

 

/** Book.java */

 

package sean.study.commons.collections;
 
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
 
public class Book {
    
    private String name;
    private String isbn;
    private double retailPrice;
    
    public Book() {
    }
    
    public Book(String name, String isbn, double retailPrice) {
        this.name = name;
        this.isbn = isbn;
        this.retailPrice = retailPrice;
    }
    
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
"name", name)
"ISBN", isbn)
"retailPrice", retailPrice)
        .toString();
    }
 
    public String getIsbn() {
        return isbn;
    }
 
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public double getRetailPrice() {
        return retailPrice;
    }
 
    public void setRetailPrice(double retailPrice) {
        this.retailPrice = retailPrice;
    }
    
}
 
/** BagUsage.java */
 
package sean.study.commons.collections;
 
import org.apache.commons.collections.Bag;
import org.apache.commons.collections.BagUtils;
import org.apache.commons.collections.bag.HashBag;
import org.apache.commons.lang.StringUtils;
 
public class BagUsage {
 
    public static void main(String[] args) {
        demoBagUsage();
    }
 
    public static void demoBagUsage() {
 
" 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);
 
        // create a bag
        Bag myBag = BagUtils.typedBag(new HashBag(), Book.class);
        myBag.add(book1, 360);
        myBag.add(book2, 500);
        myBag.add(book3, 170);
 
        // calculations for a bag
        double price1 = book1.getRetailPrice();
        double price2 = book2.getRetailPrice();
        double price3 = book3.getRetailPrice();
        int book1Count = myBag.getCount(book1);
        int book2Count = myBag.getCount(book2);
        int book3Count = myBag.getCount(book3);
        double totalValue = (price1 * book1Count) + (price2 * book2Count)
                + (price3 * book3Count);
 
        // dispaly results
"There are " + book1Count + " copies of "
".");
"There are " + book2Count + " copies of "
 ".");
"There are " + book3Count + " copies of "
".");
"The total value of these books is: "
 
        System.out.println();
 
    }
 
}

 

以下是运行结果:

 

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

There are 360 copies of Refactoring Workbook.

There are 500 copies of J2EE Design Patterns.

There are 170 copies of Agile Software Development.

The total value of these books is: 43258.0

 

需要说明的是,以上的代码仅仅为了演示如何使用Bag,实际应用不建议像这样硬编码。