How to invoke methods of objects with different types with same name and different return values?

Refresh

December 2018

Views

49 time

2

I have a lot of classes generated by JAXB and I can not change them. I have to get the values of the properties for some of their objects in a pretty similar way and then populate table with them. Here I am giving the code for two such getter methods:

private String getPropertyIdentifierStringOrNull(IdentifierType obj)
{
    if(obj != null)
        return obj.getValue();
    else
        return null;
}

private XMLGregorianCalendar getPropertyXMLGregorianCalendarOrNull(DateType obj)
{
    if(obj != null)
        return obj.getValue();
    else
        return null;
}

DateType and IdentifierType do not have common supperclass, and as in this example code return values can be of different types.

I am trying to write one method instead of bunch of these. I've come up with this solution using generic method with the reflection:

@SuppressWarnings("unchecked")
private <T> T getPropertyOrNull(Object obj)
{
    if(obj != null)
    {
        try
        {
            return (T) obj.getClass().getMethod("getValue").invoke(obj);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    return null;
}

Is this good way of doing this kind of calls or is there any better solution?

1 answers

1

Я бы не использовать отражение для этого. Вместо этого, вы можете сделать это с , Functionкоторый извлекает нужные свойства из данного объекта, следующим образом :

static <T, U> U getPropertyOrNull(T obj, Function<? super T, ? extends U> extractor) {
    return obj != null ? extractor.apply(obj) : null;
}

Вы можете использовать его таким образом:

IdentifierType identifier = new IdentifierType();
DateType date = new DateType();

String identifierValue = getPropertyOrNull(identifier, IdentifierType::getValue);

XMLGregorianCalendar dateValue = getPropertyOrNull(date, DateType::getValue);

Кроме того , не используя отражение, преимущество такого подхода состоит в том, что это тип безопасно, то есть , если вы вызываете метод с IdentifierTypeи DateType::getValueаргументами, вы получите ошибку компиляции.