Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Как можно оптимизировать метод String getType(Object o)?

#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 Map SUPPORTED_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; } Вместо добавления кода в метод, новый тип будет добавляться в мапу. Мапу можно заполнять из внешних источников (например, из базы, пропертей или конфигурационного файла)

Комментариев нет:

Отправить комментарий