有什么方法可以声明构造函数将HashSet作为参数之一,然后在对象初始化期间直接将HashSet值作为参数传递? 我的意思是这样的:
public class Order {
private Set<Product> products = new HashSet<Product>();
public Order (???) {
this.products = ???
}
}
然后,在初始化对象时:
Order order = new Order("product1", "product2", "product3");
有可能吗?
答案 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")));
效率不高,但有效。