Простой / элегантный способ сделать объект для преобразования объекта в Java? - PullRequest
1 голос
/ 07 января 2009

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

if (obj instanceOf X)
{
    //code to initialize internal object
}
else if (obj instanceOf Y)
{
    //code to initialize different object
}
else if (obj instanceOf Z)
{
    //more init code
}
...

Лично я не нахожу это решение удовлетворительным; он длинный и грязный и, что еще хуже, многие из блоков if-else содержат больше блоков if-else, связанных с подклассами и крайними случаями. Есть ли лучшее решение этой проблемы?

Ответы [ 4 ]

7 голосов
/ 07 января 2009

Создайте такой интерфейс

public interface Converter<S,T> {
  public T convert(S source);
}

и реализовать его для каждого объекта X, Y, Z. Затем поместите все известные конвертеры в карту и получайте удовольствие!

0 голосов
/ 08 января 2009

Если эти внутренние объекты представляют интерфейс для приложения, а не используются напрямую, адаптируйте их, а не преобразуйте их.

То есть, если у вас есть что-то вроде этого:

public class ThirdPartyClass { ... }
public interface InternalInterface { ... }
public class InternalClass { ... }

Internal foo(ThirdPartyClass thirdParty) {
    InternalClass internal = new InternalClass();
    // convert thirdPaty -> internal
    return internal;
}

Тогда вместо этого сделайте что-то вроде этого:

public class ThirdPartyClass { ... }
public interface InternalInterface { ... }
public class InternalClass { ... }

public class ThirdPartyInternalAdapter implements InternalInterface {
    private final ThirdPartyClass thirdParty;
    public ThirdPartyInternalAdapter(ThirdPartyClass thirdParty) {
        this.thirdParty = thirdParty;
    }
    // implement interface in terms of thirdParty
}

Из вашего вопроса не ясно, применимо ли это, но если это так, это может быть проще и эффективнее, чем прямое преобразование объекта в объект.

0 голосов
/ 07 января 2009

Код, подобный этому, со всеми его instanceof условиями, требует интерфейса!

Возможно, вы захотите создать public interface Initializable с помощью метода public void initialize().

Тогда все, если ваши if-else просто преобразуются в один obj.initialize() вызов.

0 голосов
/ 07 января 2009

Хотя это не работает для крайних случаев, построение карты между классами и конвертерами

X.getClass () -> X Converter
Y.getClass () -> Конвертер Y

сделает вас намного ближе. Вы также хотели бы проверить суперклассы, если листовой класс не найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...