2015-04-12 2 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

Вышеуказанное выглядит так, как будто вы хотите, чтобы конструктор принимал varargs из String, а затем создавал HashSet через эти varargs.

A HashSet не может быть создан с помощью varargs, поэтому, возможно, создайте набор, а затем добавьте каждый элемент по очереди. Или создайте коллекцию этих элементов vararg, а затем создайте непосредственно 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"))); 

Это не очень эффективное время, но оно работает.

Смежные вопросы