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().