#java #задание_на_собеседовании
Не так давно у меня было собеседование в компанию Luxoft. И был задан такой вопрос - "На код ревью к вам приходит метод String getType(Object obj). Также известно, что со временем этот метод нужно будет расширять, чтобы он работал с новыми типами. Чтобы вы в этом методе могли улучшить?". Подскажите если какое то более компактное или универсальное решение реализации этого метода? Вот код метода: public String getType(Object obj) { if (obj instanceof String) { return "String"; } if (obj instanceof List) { return "List"; } if (obj instanceof ArrayList) { return "ArrayList"; } if (obj instanceof Number) { return "Number"; } return ""; }
Ответы
Ответ 1
Любой тип будет поддерживаться этим методом public String getType(Object o) { if (o == null) { throw new IllegalStateException("Object = null"); } return o.getClass().getSimpleName(); }Ответ 2
предложу такую модификацию способа @Flippy public String getType(Object o) { if (o == null) return null; Class clazz=o.getClass(); Class[] interfaces=clazz.getInterfaces(); String interfaceName=null; int shortestLength=Integer.MAX_INT; //ищем интерфейс с самым коротким именем for(Class interfaze:interfaces) { if(interfaze.getSimpleName().length() < shortestName) { interfaceName=interfaze.getSimpleName(); shortestName=interfaze.getSimpleName().length(); } } if(interfaceName==null) return clazz.getSimpleName(); return interfaceName(); }Ответ 3
Также известно, что со временем этот метод нужно будет расширять, чтобы он работал с новыми типами. Исходя из этого условия, я предполагаю, что метод на данный момент работает только с ограниченными типами данных: private static final MapSUPPORTED_TYPES = new HashMap<>(); static { SUPPORTED_TYPES.put(List.class, "List"); SUPPORTED_TYPES.put(ArrayList.class, "ArrayList"); } public static void main(String[] args) throws IOException { System.out.println(getType(new ArrayList<>())); System.out.println(getType(new LinkedList<>())); } public static String getType(Object obj) { String rez = SUPPORTED_TYPES.get(obj.getClass()); if (rez == null) { throw new IllegalArgumentException("Class " + obj.getClass().getSimpleName() + " does not supported"); } return rez; } Вместо добавления кода в метод, новый тип будет добавляться в мапу. Мапу можно заполнять из внешних источников (например, из базы, пропертей или конфигурационного файла)
Комментариев нет:
Отправить комментарий