Не так давно у меня было собеседование в компанию 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 "";
}
Любой тип будет поддерживаться этим методом
public String getType(Object o) {
if (o == null) {
throw new IllegalStateException("Object = null");
}
return o.getClass().getSimpleName();
}
Также известно, что со временем этот метод нужно будет расширять, чтобы он работал с новыми типами.
Исходя из этого условия, я предполагаю, что метод на данный момент работает только с ограниченными типами данных:
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;
}
Вместо добавления кода в метод, новый тип будет добавляться в мапу. Мапу можно заполнять из внешних источников (например, из базы, пропертей или конфигурационного файла)
предложу такую модификацию способа @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();
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Написал приложение, в нем есть функция определения пути между 2 координатамиДелаю при помощи Directions API, и всё прекрасно работает
Понимаю, что вопрос, скорее всего элементарный, но никак не могу додуматься сама
Есть PDF документ по которому нужно осуществить поиск и сделать выборку нужных данныхПри поиске по PDF руками, ищется всё