javax.faces.model.SelectItem能用set展示数据吗?No

   在JSF的项目中,我们知道javax.faces.model包下的SelectItem类可以用数组或者List的实现类来封装数据并展示。当下拉框的数据要展示排序后并且没有重复值的情况时,我们难免会想到把SelectItem封装到Set集合中。经过相关测试后发现java.util包下的Set不能封装SelectItem,先放上修改后的SelectItem代码,再一一分析:

import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

/**
 * @author Zhengjiang Chu
 * @version 2.0
 */
public class SelectItem extends javax.faces.model.SelectItem implements
		Comparable<Object> {
	/**
	 * serialVersionUID long
	 */
	private static final long serialVersionUID = -11786629707360771L;

	public SelectItem() {
	}

	public SelectItem(Object value) {
		super.setValue(value);
		super.setLabel(value.toString());
	}

	public SelectItem(Object value, String label) {
		super.setValue(value);
		super.setLabel(label);
	}

	@Override
	public boolean equals(Object object) {
		return EqualsBuilder.reflectionEquals(this, object);
	}

	@Override
	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}

	@Override
	public int compareTo(Object obj) {
		return CompareToBuilder.reflectionCompare(this, obj);
	}

}

   javax.faces.model.SelectItem没有自己的equals方法,我们知道封装在Set的数据必须具有可比性,所以没有equals和hashCode的SelectItem无法用Set存储。集合中有个contains方法,传入一个对象,如何集合中可以找到此对象返回true反之返回fasle,当我们想在Set集合中判断指定的SelectItem是否存在时就少不了compareTo方法。
以下是个简单的demo:

@Test
public void testSelectItemSet(){
//import javax.faces.model.SelectItem;
	Set<SelectItem> set = new TreeSet<SelectItem>();
	SelectItem item = new SelectItem("aaa");
	SelectItem item1 = new SelectItem("aaa");
	SelectItem item2 = new SelectItem("bbb");
	SelectItem item3 = new SelectItem("123");
	SelectItem item4 = new SelectItem("123");
	SelectItem item5 = new SelectItem("bbb");
	SelectItem item6 = new SelectItem("caa");
	set.add(item);
	set.add(item1);
	set.add(item2);
	set.add(item3);
	set.add(item4);
	set.add(item5);
	set.add(item6);
	System.out.println(set.size());
	//java.lang.ClassCastException: javax.faces.model.SelectItem cannot be cast to java.lang.Comparable
	}

    以上总结比较粗糙,仅做参考。

你可能感兴趣的:(JSF)