Прежде чем начать, я знаю, что есть несколько ответов на этот вопрос, которые предлагают альтернативные подходы. Я ищу помощь в этом конкретном подходе в отношении того, возможно ли, а если нет, аналогичные подходы, которые могут работать.
У меня есть метод, который принимает суперкласс и вызывает метод, основанный на типе переданного объекта. например:
public void handle(Object o){
if (o instanceof A)
handleA((A)o);
else if (o instanceof B)
handleB((B)o);
else if (o instanceof C)
handleC((C)o);
else
handleUnknown(o);
Я не могу изменить подтипы, чтобы переопределить метод handle()
, поскольку этот ответ предложил бы, потому что я не владею классами. Таким образом, метод instanceof
- это все, что у меня есть.
Я хотел бы использовать оператор switch
вместо if/else
, просто потому, что он намного опрятен. Я знаю, что вы можете включать только примитивы и строки, поэтому я перехожу к имени класса:
switch(o.getClass().getCanonicalName()){
case "my.package.A":
handleA((A)o);
break;
case "my.package.B":
handleB((B)o);
break;
case "my.package.C":
handleC((C)o);
break;
default:
handleUnknown(o);
break;
}
Ловушка здесь в том, что канонические имена ОЧЕНЬ долго (например, 12 подпакетов), и я не могу вызывать ClassName.class.getCanonicalName()
в аргументе case, потому что Java этого не допускает. Итак, моим следующим решением был Enum. Здесь я ударил по моей проблеме.
Я хочу, чтобы мой код выглядел примерно так:
public enum Classes {
A (A.getCanonicalName()),
B (B.getCanonicalName()),
C (C.getCanonicalName());
}
switch (o.getClass().getCanonicalName()){
case Classes.A:
handleA((A)o);
break;
case Classes.B:
handleB((B)o);
break;
case Classes.C:
handleC((C)o);
break;
default:
handleUnknown(o);
break;
}
Но это не компилируется. Я не знаю, почему. Мне нужен какой-то подход, который позволяет мне переключать тип без ввода всего канонического имени. Если я это сделаю, я бы просто использовал if/else
и instanceof
.
ПРИМЕЧАНИЕ Существует несколько типов, имеющих одно и то же имя (внутренние классы), поэтому getSimpleName()
отсутствует.