Как вернуть конкретную реализацию на основе переменной (Enum / Object) - PullRequest
0 голосов
/ 01 мая 2020

Мне было интересно, как я могу вернуть конкретную реализацию, заданную переменной в качестве аргумента в функции. Это мой тестовый код

public interface Items {
  String getName();
}


public class Car implements Items{
  @Override
  public String getName() {
    return "Car";
  }

  public void drive(){
    //To something
  }
}

public class Shelf implements Items{
  @Override
  public String getName() {
    return "Shelf";
  }
  public String getBooks(String bookName){
    return bookName;
  }
}

public enum Item {
  CAR(Service::getCar),
  TABLE(Service::getShelf),
  ;
  Function<Service, ? extends Items> serviceFunction;
  Item(Function<Service, ? extends Items> serviceFunction) {
    this.serviceFunction = serviceFunction;
  }
}

public class Service {
  public Car getCar(){
    return new Car();
  }
  public Shelf getShelf(){
    return new Shelf();
  }

  public Items getItem(Item item){
    return item.serviceFunction.apply(this);
  }

  public static void main(String[] args) {
    Service service = new Service();
    service.getItem(Item.CAR).getName();
//    service.getItem(Item.CAR).drive(); // This is not valid.
  }
}

Итак, то, что я хочу, основано на этом перечислении, я должен иметь возможность выполнять набор функций, связанных с этим перечислением, не передавая сам идентификатор реализации.

Я знаю, что я могу сделать это. И я буду работать, но я думал о получении конкретной реализации без прохождения Class<T> klass.

public <T extends Items> T getItem(Item item, Class<T> klass){
  return (T) item.serviceFunction.apply(this);
}

public static void main(String[] args) {
  Service service = new Service();
  service.getItem(Item.CAR, Car.class).drive();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...