Не спрашивайте у ваших объектов информацию, а затем принимайте решения относительно того, что они вам говорят. Заставь свои объекты делать работу за тебя. То есть не делайте этого:
if (body.isXML()) {
// do XML stuff
}
else if (body.isJSON()) {
// do JSON stuff
}
Это головная боль от обслуживания. Вместо этого сделайте что-то подобное (реализации BodyWrapper будут созданы с использованием метода абстрактной фабрики или аналогичного)
public interface BodyWrapper {
Object doStuff();
}
public class DOMBodyWrapper implements BodyWrapper {
public Object doStuff() {
}
}
public class JSONBodyWrapper implements BodyWrapper {
public Object doStuff() {
// do something and return a success/failure result. I've
// deliberately not defined what this object is....
}
}
и затем:
// get the body via a factory or similar
body.doStuff();
Таким образом, что-то создает соответствующую реализацию BodyWrapper
, и затем вместо того, чтобы спрашивать, какой это тип, вы просто используете это. Обратите внимание, что BodyWrapper не возвращает различные типы внутренних структур, потому что он (возможно, абстрактный базовый класс) делает всю работу за вас.