2011-08-24 74 views
1

我想的如果在施放一個對象 - else語句如下:在鑄造過程中的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

你不能達到你想要的這種方式。最好試試這個:

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共享您在每個塊中使用的方法,繼承可以幫助您將兩個塊的代碼分組。

+1

如何檢查這是MO的一個實例?我不知道如何在Java中執行此操作,Object類也不包含此方法。 – Will

+2

''instanceof''是一個java關鍵字,並且確實如此。去嘗試一下! – f1sh

0

您實際上是在聲明兩個變量名爲object。他們每個人都有一個非常有限的範圍內,即他們被發現在該塊

假設一秒鐘,你訪問後if語句完成變量:什麼會的object類型而定在這種情況下?

您需要在if之前聲明變量,並在兩種情況下都指定該變量。但是,您需要爲此確定一種類型。在最壞的情況下,你需要使用Object

0

在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。您會發現這種if可能會在您的代碼中重複出現。您可以將它們移動到「工廠」類。 (或者通過移動if到它,這取決於它使用transformer作爲工廠。)
0

試試這個:

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

變量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

這樣做的最優雅的方法是聲明一個接口(比如說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你仍然可以通過爲他們創造一個包裝,實現了這樣做以上界面。