Подтвердить что ты не робот

Является ли Java методом "своего рода класса"

У меня есть базовый класс Statement, который наследует несколько других классов, называемый IfStatement, WhereStatement и т.д.... Каков наилучший способ выполнить тест в инструкции if, чтобы определить, какие класс Statement, экземпляр выводится из?

4b9b3361

Ответ 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.

Ответ 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. Это правильный способ сделать это.