Как избавиться от instanceof в этой реализации Builder

Идея

Мне нужно создать команды. Команды можно настроить с помощью параметров. Не каждая команда может получить одни и те же параметры. Так что некоторые приходится игнорировать.

У меня есть команда абстрактного класса, в которой я определил Builder. По умолчанию каждый параметр добавления выдает «UnsupportedOperationException»

public abstract class Command {

   public static abstract class CommandBuilder {

        // TODO instanceof. How to do this better?
        public CommandBuilder append(Parameter p)
            throws UnsupportedOperationException {

            if (p instanceof URLParameter)
                return append((URLParameter) p);

            if (p instanceof ActionParameter)
                return append((ActionParameter) p);

            if (p instanceof RepeatParameter)
                return append((RepeatParameter) p);

            if (p instanceof TimeOutParameter)
                return append((TimeOutParameter) p);

            return this;

        }

        public CommandBuilder append(URLParameter p)
                throws UnsupportedOperationException {

                    throw new UnsupportedOperationException(
                        "URLParameter not applicable");

        }

        public CommandBuilder append(RepeatParameter p)
            throws UnsupportedOperationException {

                throw new UnsupportedOperationException(
                    "RepeatParameter not applicable");

            }
           ...

}

. Если вы хотите, чтобы параметр применялся к определенной конкретной команде, скажем, к FTP-команде.

Вам придется сделать что-то вроде этого:

public class FTPCommand extends Command {

    public static class Builder extends CommandBuilder {

    @Override
    public CommandBuilder append(URLParameter p) {
            System.out.println("URLParemeter appended");
                return this;
            }
        }

}

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

Но клиент этого CommandBuilder может быть не в состоянии предоставить конкретный подкласс. Итак, в целом дается «Параметр». Но для этого нужно попасть в нужное место (метод)

Например, URLParameter должен поступать вappend(UrlParameter p)

Как я могу сделать это чистым (er )и хорошим (r )способом? Потому что я на самом деле не в восторге от использования instanceof.

5
задан S.L. Barth - Reinstate Monica 3 August 2012 в 09:40
поделиться