Java, как хранить геттеры в карте
Я хотел бы назвать динамический геттер по заданному перечислению. Я хочу определить это в статической карте. Но я не уверен, как мой объект будет использовать метод.
У меня есть Color enum и библиотека объектов.
public enum Color {
Red,
Blue,
Black,
Green,
Pink,
Purple,
White;
}
public class Library{
public List<String> getRed();
public List<String> getBlue();
public List<String> getBlack();
.....
}
Я хочу иметь карту, поэтому, когда у меня будет новый объект Библиотеки по типу, я назову правильный get. Например:
private static Map<Color, Function<......>, Consumer<....>> colorConsumerMap = new HashMap<>();
static {
colorConsumerMap.put(Color.Red, Library::getRed);
colorConsumerMap.put(Color.Blue, Library::getBlue);
}
Library lib = new Library();
List<String> redList = colorConsumerMap.get(Color.Red).apply(lib)
Но таким образом это не компилируется. Любые предложения, пожалуйста?
3 ответа
Похоже, ваш Map
должен быть объявлен как:
private static Map<Color, Function<Library,List<String>> colorConsumerMap = new HashMap<>()
так как ваши добытчики возвращаются List<String>
,
Привет, пожалуйста, найдите ниже код для поставщиков:-
enum Color {
Red,
Blue,
Black,
Green,
Pink,
Purple,
White;
}
class Library{
public Supplier supplier;
public List<String> getRed(){}; // implement according to need
public List<String> getBlue(){}; // implement according to need
public List<String> getBlack(){}; // implement according to need
private Map<Color, Supplier<List<String>>> colorConsumerMap = new HashMap<Color, Supplier<List<String>>>();
static {
colorConsumerMap.put(Color.Red, Library::getRed);
colorConsumerMap.put(Color.Blue, Library::getBlue);
}
Здесь мы используем Java 8 supplier
,
Чтобы получить значение от HashMap
пожалуйста, используйте код:-
Supplier getMethod = colorConsumerMap.get(Color.Red);
List<String> values = getMethod.get();
Интерфейс Function имеет два параметра типа: тип ввода (Library
в вашем случае) и тип вывода (List<String>
в твоем случае). Таким образом, вы должны изменить тип вашей карты на Map<Color, Function<Library, List<String>>
,
Однако рассмотрите возможность поместить логику не в карту, а в сами значения enum. Например:
public enum Color {
Red(Library::getRed),
Blue(Library::getBlue);
private Function<Library, List<String>> getter;
private Color(Function<Library, List<String>> getter) {
this.getter = getter;
}
public List<String> getFrom(Library library) {
return getter.apply(library);
}
}
public class Library{
public List<String> getRed() { return Collections.singletonList("Red"); }
public List<String> getBlue() { return Collections.singletonList("Blue"); }
}
Library lib = new Library();
System.out.println(Color.Red.getFrom(lib));
System.out.println(Color.Blue.getFrom(lib));
Или, если вы не хотите использовать функции Java 8:
public enum Color {
Red {
List<String> getFrom(Library library) {
return library.getRed();
}
},
Blue {
List<String> getFrom(Library library) {
return library.getBlue();
}
};
abstract List<String> getFrom(Library library);
}
Это имеет то преимущество, что если вы добавите новый цвет позже, вы не сможете забыть обновить карту, потому что компилятор будет жаловаться, если вы этого не сделаете.