2015-04-12 140 views
1

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

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

,然后,在初始化对象:

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

这可能吗?

+0

你签出了所有的'HashSet'构造函数,创建一个对象并将其传递给构造函数吗? –

回答

0

上面看起来像我想你想要一个构造函数varargsString类型,然后通过这些可变参数创建HashSet

A HashSet无法通过可变参数创建,因此可能创建该集合,然后依次添加每个元素。或者创建这些可变参数元素的集合,然后直接从中构建HashSet

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参数,它可以让您调用,你想构造。

它也检查重复在初始化过程中,我会建议重复是一个错误;但你可以登录并继续。

4

可以使用可变参数:

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

但后来你传递给构造产品实例:

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

这就像我想实现的东西 - 但是有可能传递已经存在的对象而不是创建新的对象吗? –

+0

@JarosławRewers当然,你可以传递已经存在的'Product'实例。 – Eran

0

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

public Order (HashSet<String> myHashSet) 

然后,只要你想初始化它,cal l它这样:

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

它不是很时间效率,但它的工作原理。