У меня есть базовый класс Statement
, который наследует несколько других классов, называемый IfStatement
, WhereStatement
и т.д.... Каков наилучший способ выполнить тест в инструкции if
, чтобы определить, какие класс Statement
, экземпляр выводится из?
Является ли Java методом "своего рода класса"
Ответ 1
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
Хорошая вещь об этой технике (в отличие от ключевого слова "instanceof" ) заключается в том, что вы можете передать тестовый класс как объект. Но, да, кроме этого, он идентичен "instanceof".
ПРИМЕЧАНИЕ. Я сознательно избегал редакции того, правильно ли проверять тип-экземпляр. Да, в большинстве случаев лучше использовать полиморфизм. Но это не то, что задал ОП, и я просто отвечаю на его вопрос.
Ответ 2
if(object instanceof WhereStatement) {
WhereStatement where = (WhereStatement) object;
doSomething(where);
}
Обратите внимание, что такой код обычно означает, что ваш базовый класс не имеет полиморфного метода. т.е. doSomething()
должен быть методом Statement
, возможно абстрактным, который переопределяется подклассами.
Ответ 3
Ответ на ваш вопрос - instanceof.
Однако имейте в виду, что если ваш код нуждается в instanceof, это признак того, что с вашим дизайном что-то не так. Есть случаи, когда instanceof является оправданным, но они являются скорее исключениями. Обычно, если ваши подклассы должны вести себя по-другому, вы должны использовать полиморфизм вместо if() s.
Ответ 4
isAssignableFrom (java.lang.Class) из класса - ваш ответ. http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class)
Ответ 5
Попробуйте следующее:
if (Statement.class.isInstance(obj)) {
doStuffWithStatements((Statement) obj));
}
поскольку метод Class.isInstance() принимает экземпляр объекта как параметр.
Ответ 6
Это не способ делать вещи объектно-ориентированным способом, это возврат к старой дихотомии кода/данных. Теперь это не обязательно плохо (если вы знаете, что делаете), но его следует оставить на не-объектно-ориентированные языки, такие как C.
При правильном дизайне вам не нужно такого поведения. Вместо конструкции:
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
(извинитесь за benjismith за "кражу" его кода), вы действительно должны сами заставлять объект сам отвечать за свои собственные действия:
obj.doStuff();
Тогда у каждого другого класса obj
будет собственное определение для doStuff
. Это правильный способ сделать это.