2016-04-05 114 views
0

嗨,我在一個情況下,我需要使用多個else if's,我想使用switch語句,我已經嘗試了很多,但我無法這樣做。如何轉換下面的內容如果要切換?如何替換if語句與switch語句

public ApiObservables(Object o) { 
     if (o instanceof SitesController) { 
      mSitesApi = getSitesApi(); 
     } else if (o instanceof QuestionController) { 
      mQuestionApi = getQuestionApi(); 
     } //more else if's 
    } 

我想這樣做:

public ApiObservables(Object o) { 
     switch (o) { 

     } 
    } 
+0

通常它是更好地使用多態方法調用,而不是'instanceof'檢查,即使它可能與switch語句來完成。 – Joni

回答

2
  • 當使用開關的情況下,控制變量必須原始類型或字符串,或枚舉的。你不能在開關櫃中使用對象。 從JLS:

    類型中表達的必須是char,字節,短型,整型,字符,字節,短,整數,字符串,或枚舉類型

  • 開關情況下,只有檢查是否相等(即類似於使用==運算符)。所以,你不能在開關的情況下

+0

那麼你是說在這種情況下不可能使用開關? –

+0

@NonthonbamTonthoi是的。 – Hackerdarshi

+0

你也可以切換枚舉 – Dimi

1

使用instanceof在你的情況,我會用方法重載:

public ApiObservables foo(Object o) { 
    //throw new IllegalArgumentException? 
} 

public ApiObservables foo(SitesController o) { 
    return getSitesApi(); 
} 

public ApiObservables foo(QuestionController o) { 
    return getQuestionApi(); 
} 
+0

謝謝您的回覆 –

0
I don't know about your remaining code try this by passing in this function repective controller string as per your object 

    and if you use object in switch case then i think it will not support 

try this one 

     public ApiObservables(String o) { 
      switch(o) { 
      case "SitesController": 
       mSitesApi = getSitesApi(); 
       break; 

      case "QuestionController": 
      mQuestionApi = getQuestionApi(); 

      default: 
       System.out.println("place any thing that you want to show any message"); 
       break; 
      } 
     } 
1

我不知道你是否能重構你的代碼,但什麼關於使用接口的不同方法?事情是這樣的:

interface API { 
    //method signatures here 
} 

class SitesApi implements API { 
    //implementation here 
} 

class QuestionApi implements API { 
    //implementation here 
} 

interface Controller { 
    API getAPI(); 
} 

class QuestionController implements Controller { 
    @Override 
    public API getAPI() { 
     return new QuestionAPI(); 
    } 
} 

class SitesController implements Controller { 
    @Override 
    public API getAPI() { 
     return new SitesAPI(); 
    } 
} 

然後:

public ApiObservables(Controller controller) { 
    someApi = controller.getAPI(); 
}