есть ли способ, которым я могу объявить конструктор, чтобы принять HashSet как один из аргументов, а затем передать значение HashSet непосредственно в качестве аргумента во время инициализации объекта? Я имею в виду что-то вроде этого:
public class Order {
private Set<Product> products = new HashSet<Product>();
public Order (???) {
this.products = ???
}
}
а затем, при инициализации объекта:
Order order = new Order("product1", "product2", "product3");
Является ли это возможным?
Вы можете использовать varargs:
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"));
Product
.
Я бы рекомендовал что-то вроде:
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, который позволяет вам вызывать конструктор, как вам хотелось бы.
Он также проверяет дубликаты во время инициализации, я бы предположил, что дубликаты являются ошибкой; но вы можете просто зарегистрировать его и продолжить.
Если вам действительно нужно использовать HashSet в конструкторе, я бы сделал что-то подобное в конструкторе:
public Order (HashSet<String> myHashSet)
Затем, когда вы хотите его инициализировать, вызовите его так:
Order order = new Order(new HashSet<String>(Arrays.asList("product1", "product2")));
Это не очень эффективно, но работает.
Вышеприведенное выглядит так, как будто вы хотите, чтобы конструктор использовал varargs типа String
, а затем создавал HashSet
через эти varargs.
HashSet
не может быть создан с помощью varargs, поэтому, возможно, создайте набор, а затем добавьте каждый элемент по очереди. Или создайте коллекцию этих элементов vararg, а затем создайте HashSet
непосредственно из этого.
HashSet
, чтобы создать объект и передать его конструктору?