Hashset作为Java中的构造函数参数

时间:2015-04-12 11:36:59

标签: java constructor hashset

有什么方法可以声明构造函数将HashSet作为参数之一,然后在对象初始化期间直接将HashSet值作为参数传递? 我的意思是这样的:

public class Order {
    private Set<Product> products = new HashSet<Product>();
    public Order (???) {
    this.products = ???
    }
}

然后,在初始化对象时:

Order order = new Order("product1", "product2", "product3");

有可能吗?

4 个答案:

答案 0 :(得分:4)

您可以使用varargs:

public class Order {
    private Set<Product> products;
    public Order (Product... products) {
       this.products = new HashSet<Product> (Arrays.asList(products));
    }
}

然后你传递给构造函数Product instances:

Order order = new Order(new Product("product1"), new Product("product2"), new Product("product3"));

答案 1 :(得分:1)

我会推荐类似的东西:

public class Order {
    private final Set<String> strings;

    public Order(final Set<String> strings) {
        this.strings = strings;
    }

    public Order(final String... strings) {
        this(toSet(strings));
    }

    private static Set<String> toSet(String[] strings) {
        final Set<String> ss = new HashSet<>();
        for (final String s : strings) {
            if (!ss.add(s)) {
                throw new IllegalArgumentException("Duplicate string " + s);
            }
        }
        return ss;
    }
}

这需要一个varargs参数,允许您根据需要调用构造函数。

它还会在初始化期间检查重复项,我建议重复项是一个错误;但你可以记录它并继续。

答案 2 :(得分:0)

以上内容让我觉得您希望构造函数采用String HashSet类型,然后通过这些varargs创建HashSet

无法通过varargs创建HashSet,因此可能会创建该集合,然后依次添加每个元素。或者创建这些vararg元素的集合,然后直接从中构造{{1}}。

答案 3 :(得分:0)

如果你真的需要在构造函数中使用HashSet,我会在构造函数中做这样的事情:

public Order (HashSet<String> myHashSet)

然后,只要你想初始化它,就这样调用它:

Order order = new Order(new HashSet<String>(Arrays.asList("product1", "product2")));

效率不高,但有效。