Method reference при создании экземпляров класса

Всем добра) Подскажите пожалуйста, как в рамках Java 8 можно реализовать этот код с применением Method refence

public enum ProductType {
    FOOD,
    CLOTHES,
    TOOL;

    public Product createProduct(double weight, double volume) {
        switch (this) {
            case FOOD:
                return new Food(weight, volume);
            case CLOTHES:
                return new Clothes(weight, volume);
            case TOOL:
                return new Tool(weight, volume);
            default:
                throw new IllegalStateException("Unexpected value: " + this);
        }
    }
}


private Product generateRandomProduct() {
    ProductType[] typeProducts = ProductType.values();
    int randomIndex = new java.util.Random().nextInt(typeProducts.length);
    double weight = new java.util.Random().nextDouble() * MAX_WEIGHT_OF_PRODUCT;
    double volume = new java.util.Random().nextDouble() * MAX_VOLUME_OF_PRODUCT;
    ProductType randomProductType = typeProducts[randomIndex];

    return randomProductType.createProduct(weight, volume);
}

Ответы (1 шт):

Автор решения: Serodv

Enum я бы переписал таким образом:

enum ProductType {
    FOOD(Food::new),
    CLOTHES(Clothes::new),
    TOOL(Tool::new);

    private BiFunction<Double, Double, Product> instanceFunction;

    ProductType(BiFunction<Double, Double, Product> instanceFunction) {
        this.instanceFunction = instanceFunction;
    }

    public Product createProduct(double weight, double volume) {
        return instanceFunction.apply(weight, volume);
    }
}

Что касается метода generateRandomProduct(), то там кардинально и нечего менять, разве что перенести весь функционал в метод createProduct().

→ Ссылка