javax.faces.model.SelectItem能用set展示数据吗?No
程序员文章站
2024-03-13 16:18:21
...
[size=medium] 在JSF的项目中,我们知道javax.faces.model包下的SelectItem类可以用数组或者List的实现类来封装数据并展示。当下拉框的数据要展示排序后并且没有重复值的情况时,我们难免会想到把SelectItem封装到Set集合中。经过相关测试后发现java.util包下的Set不能封装SelectItem,先放上修改后的SelectItem代码,再一一分析:[/size]
[size=medium] javax.faces.model.SelectItem没有自己的equals方法,我们知道封装在Set的数据必须具有可比性,所以没有equals和hashCode的SelectItem无法用Set存储。集合中有个contains方法,传入一个对象,如何集合中可以找到此对象返回true反之返回fasle,当我们想在Set集合中判断指定的SelectItem是否存在时就少不了compareTo方法。
以下是个简单的demo:[/size]
[size=medium]以上总结比较粗糙,仅做参考。[/size]
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);
}
}
[size=medium] javax.faces.model.SelectItem没有自己的equals方法,我们知道封装在Set的数据必须具有可比性,所以没有equals和hashCode的SelectItem无法用Set存储。集合中有个contains方法,传入一个对象,如何集合中可以找到此对象返回true反之返回fasle,当我们想在Set集合中判断指定的SelectItem是否存在时就少不了compareTo方法。
以下是个简单的demo:[/size]
@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
}
[size=medium]以上总结比较粗糙,仅做参考。[/size]