Java 当使用JAXB从XML读取时,如何检查TreeSet中元素的唯一性?

Java 当使用JAXB从XML读取时,如何检查TreeSet中元素的唯一性?,java,xml,jaxb,Java,Xml,Jaxb,我希望在尝试添加副本时引发异常 1. 1您可以实现自己的TreeSet子类 当有人试图添加重复元素时出现异常。 然后在RouteStorage类中使用此集合: /** * WARNING: This implementation violates the specification of <code>Set</code>. */ private static class MyTreeSet<E> extends TreeSet<E> {

我希望在尝试添加副本时引发异常


1.

1您可以实现自己的
TreeSet
子类 当有人试图添加重复元素时出现异常。 然后在
RouteStorage
类中使用此集合:

/**
 * WARNING: This implementation violates the specification of <code>Set</code>.
 */
private static class MyTreeSet<E> extends TreeSet<E> {

    @Override
    public boolean add(E e) {
        if (contains(e))
            throw new IllegalArgumentException("duplicate element " + e);
        return super.add(e);
    }
}

@XmlElement(name = "route")
private TreeSet<Route> storage = new MyTreeSet<Route>();

TreeSet本身不会引发异常,但如果任意两条路由相等,您可以尝试传递引发异常的比较器(或将其放入
Route.compareTo()
,但我宁愿将该“属性”放入TreeSet)。是的,这会起作用,尽管有理论上的反对意见:您的子类不满足java集合的约定。此外,我认为它最好是一个非法的州例外,而不是一个非法的辩论例外。此外,为了提高效率,您可以执行add()并测试结果,而不是执行单独的contains()调用。@MichaelKay同意,您可以提出有效的反对意见。子类违反了
Set
的规范。我建议至少对此进行一些大胆的javadoc警告,并可能使其成为一个私有的内部类,以防止在其他地方意外使用。