Кастинг во время оператора if-else - PullRequest
1 голос
/ 24 августа 2011

Я пытаюсь привести объект во время оператора if - else следующим образом:

if(sourceSystem.equalsIgnoreCase("Src")) {
  MO object = (MO) transformer.create(message,sourceSystem,flowName);
} else {  
  UO object = (URO) transformer.create(message,sourceSystem,flowName);  
}

Однако к нему нельзя получить доступ за пределами этих значений?

validator.validate(object);

не может быть разрешено вПеременная.Но, безусловно, объект создается назначенным в операторе if-else.Объект всегда будет создаваться, поэтому, почему компилятор говорит мне, что он не может быть преобразован в переменную.Да, я получаю локальные и глобальные переменные, если мне нужен доступ к общему методу между UO и MO.

Ответы [ 6 ]

6 голосов
/ 24 августа 2011

Вы не можете достичь того, чего хотите, таким образом.Лучше попробуйте это:

Object object = transformer.create(message,sourceSystem,flowName);
if( object instanceof MO )
{
  //cast and use it as MO
}//if
else
{
  //cast and use it as UO
}//else

Наследование может помочь вам сгруппировать код обоих блоков, если UO и MO совместно используют методы, которые вы используете в каждом блоке.

0 голосов
/ 24 августа 2011

Самый элегантный способ сделать это - объявить интерфейс (скажем, MessageInterface) и сделать так, чтобы ваши объекты MO и URO реализовали его.

Тогда вам придется сделать что-то вроде этого:

MessageInterface messageObject;
if(sourceSystem.equalsIgnoreCase("Src")) {
    messageObject = (MO) transformer.create(message,sourceSystem,flowName);
} else {
    messageObject = (URO) transformer.create(message,sourceSystem,flowName);
}
validator.validate(object);

Если у вас нет прямого доступа к объявлению MO и URO, вы все равно можете сделать это, создав для них оболочку, реализующую вышеуказанный интерфейс.

0 голосов
/ 24 августа 2011

Переменная object известна только внутри блоков. Если вы хотите использовать object в валидаторе, сделайте это так:

Object object = null;
if(sourceSystem.equalsIgnoreCase("Src")) {
  object = transformer.create(message,sourceSystem,flowName);
} else {  
  object = transformer.create(message,sourceSystem,flowName);  
}
validator.validate(object);

или даже намного короче

validator.validate(transformer.create(message, sourceSystem, flowName));

Обратите внимание, что приведение не требуется (если create возвращает тип, используемый validate)

0 голосов
/ 24 августа 2011

Попробуйте это:

MO MOObject = null;
UO UOObject = null;
if(sourceSystem.equalsIgnoreCase("Src"))
{
    MOObject = (MO) transformer.create(message,sourceSystem,flowName);
}
else
{
    UOObject = (URO) transformer.create(message,sourceSystem,flowName);
}

Тогда в последующем коде можно указать, какой из них не был null.

0 голосов
/ 24 августа 2011

Объявите его вне блоков if.

YourParentType object;
if(sourceSystem.equalsIgnoreCase("Src"))
    {
    object = (MO) transformer.create(message,sourceSystem,flowName);
    }
    else{
    object = (URO) transformer.create(message,sourceSystem,flowName);
    }
  • MO и URO являются связанными объектами, у вас может потребоваться общий родительский объект для них.Этот класс - то, что я имею в виду под YourParentType
  • То, что вы пытаетесь сделать, похоже на Шаблон проектирования фабрики .Вы обнаружите, что этот вид if s повторяется в майских местах в вашем коде.Вы можете переместить их в класс «Фабрика».(Или используйте transformer как фабрику, переместив туда if, в зависимости от того, что он делает.)
0 голосов
/ 24 августа 2011

Вы фактически объявляете две переменные с именем object.Каждый из них имеет очень ограниченную область видимости, а именно блок, в котором они находятся.

Предполагая на секунду, что вы могли бы получить доступ к переменным после оператор if завершается: каким будет тип object в этом случае?

Вам необходимо объявить переменную перед if и назначить ее воба случая.Вам нужно будет выбрать один тип для этого, однако.В худшем случае вам нужно использовать Object.

...