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

264
28 сентября 2017, 12:42

Не так давно у меня было собеседование в компанию 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 "";
}
Answer 1

Любой тип будет поддерживаться этим методом

public String getType(Object o) {
    if (o == null) {
        throw new IllegalStateException("Object = null");
    }
    return o.getClass().getSimpleName();
}
Answer 2

Также известно, что со временем этот метод нужно будет расширять, чтобы он работал с новыми типами.

Исходя из этого условия, я предполагаю, что метод на данный момент работает только с ограниченными типами данных:

    private static final Map<Class, String> 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;
    }

Вместо добавления кода в метод, новый тип будет добавляться в мапу. Мапу можно заполнять из внешних источников (например, из базы, пропертей или конфигурационного файла)

Answer 3

предложу такую модификацию способа @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();
}
READ ALSO
Как получить дорогу между 2 точками?

Как получить дорогу между 2 точками?

Написал приложение, в нем есть функция определения пути между 2 координатамиДелаю при помощи Directions API, и всё прекрасно работает

234
Как сделать стоп будильника по нажатию на кнопку?

Как сделать стоп будильника по нажатию на кнопку?

Понимаю, что вопрос, скорее всего элементарный, но никак не могу додуматься сама

192
поиск по PDF при наличии пробела в строке

поиск по PDF при наличии пробела в строке

Есть PDF документ по которому нужно осуществить поиск и сделать выборку нужных данныхПри поиске по PDF руками, ищется всё

205