【问题标题】:Casting during an if-else statement在 if-else 语句中进行强制转换
【发布时间】:2011-11-02 19:50:46
【问题描述】:

我正在尝试在 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 之间的通用方法,我会获得本地和全局变量。

【问题讨论】:

    标签: java variables if-statement variable-assignment


    【解决方案1】:

    你无法通过这种方式实现你想要的。最好试试这个:

    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 共享您在每个块中使用的方法,继承可以帮助您对两个块的代码进行分组。

    【讨论】:

    • 如何检查这是一个 MO 实例?我不知道如何在 Java 中执行此操作,Object 类也不包含此方法。
    • instanceof 是一个 java 关键字,正是这样做的。试试吧!
    【解决方案2】:

    最优雅的做法是声明一个接口(比如 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 的声明,您仍然可以通过为它们创建一个实现上述接口的包装器来做到这一点。

    【讨论】:

      【解决方案3】:

      在 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
      • 您尝试执行的操作类似于Factory Design Pattern。您会发现这种ifs 在您的代码中的许多地方重复出现。您可以将它们移动到“工厂”类。 (或者将if 移入其中,将transformer 用作工厂,具体取决于它的用途。)

      【讨论】:

        【解决方案4】:

        变量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 使用的类型)

        【讨论】:

          【解决方案5】:

          试试这个:

          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

          【讨论】:

            【解决方案6】:

            您实际上是在声明 两个 名为 object 的变量。它们每个都有一个非常有限的范围,即它们所在的块。

            假设您可以if 语句完成后访问变量:在这种情况下object 的类型是什么? p>

            您需要在if 之前声明一个变量 并在这两种情况下分配给它。但是,您需要为此确定一种类型。在最坏的情况下你需要使用Object

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-04-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-16
              相关资源
              最近更新 更多