Мне нужно создать команды. Команды можно настроить с помощью параметров. Не каждая команда может получить одни и те же параметры. Так что некоторые приходится игнорировать.
У меня есть команда абстрактного класса, в которой я определил 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.