Hashset как аргумент конструктора в Java

1

есть ли способ, которым я могу объявить конструктор, чтобы принять HashSet как один из аргументов, а затем передать значение HashSet непосредственно в качестве аргумента во время инициализации объекта? Я имею в виду что-то вроде этого:

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

а затем, при инициализации объекта:

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

Является ли это возможным?

  • 0
    Вы извлекли все конструкторы HashSet , чтобы создать объект и передать его конструктору?
Теги:
hashset
constructor

4 ответа

4

Вы можете использовать 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"));
  • 0
    это что-то вроде того, чего я хотел бы достичь - но возможно ли передать уже существующие объекты вместо создания новых?
  • 0
    @ JarosławRewers Конечно, вы можете пропустить уже существующие экземпляры Product .
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, который позволяет вам вызывать конструктор, как вам хотелось бы.

Он также проверяет дубликаты во время инициализации, я бы предположил, что дубликаты являются ошибкой; но вы можете просто зарегистрировать его и продолжить.

0

Если вам действительно нужно использовать HashSet в конструкторе, я бы сделал что-то подобное в конструкторе:

public Order (HashSet<String> myHashSet)

Затем, когда вы хотите его инициализировать, вызовите его так:

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

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

0

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

HashSet не может быть создан с помощью varargs, поэтому, возможно, создайте набор, а затем добавьте каждый элемент по очереди. Или создайте коллекцию этих элементов vararg, а затем создайте HashSet непосредственно из этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню