2012-06-27 36 views
1

你好編碼爲使用Bukkit遊戲我的世界插件。基本上,當一名球員右擊蛋時,蛋具有特定的耐用性。耐久性根本不會改變,因爲每當有人做這件事時,就會調用事件。該代碼我現在有沒有這樣做,但是這基本上是:是否使用switch語句中的所有情況...?

if (e.getItem().getTypeId() == 383) { 
     if (!worldguardPlugin.canBuild(e.getPlayer(), loc)) { 
      e.setCancelled(true); 
      e.getPlayer().sendMessage(
        ChatColor.YELLOW 
          + "You cant use spawner eggs in this region!"); 
      return; 
     } 
     switch (e.getItem().getDurability()) { 
     case 2: 
      expOrb(e); 
      break; 
     case 9: 
      painting(e); 
      break; 
     case 20: 
      primedTnt(e); 
      break; 
     case 40: 
      minecart(e); 
      break; 
     case 41: 
      boat(e); 
      break; 
     case 50: 
      creeper(e); 
      break; 
     case 51: 
      skeleton(e); 
      break; 
     case 52: 
      spider(e); 
      break; 
     case 53: 
      giant(e); 
      break; 
     case 54: 
      zombie(e); 
      break; 
     case 55: 
      slime(e); 
      break; 
     case 56: 
      ghast(e); 
      break; 
     case 57: 
      pigman(e); 
      break; 
     case 58: 
      enderman(e); 
      break; 
     case 59: 
      cavespider(e); 
      break; 
     case 60: 
      silverfish(e); 
      break; 
     case 61: 
      blaze(e); 
      break; 
     case 62: 
      cube(e); 
      break; 
     case 63: 
      dragon(e); 
      break; 
     case 90: 
      pig(e); 
      break; 
     case 91: 
      sheep(e); 
      break; 
     case 92: 
      cow(e); 
      break; 
     case 93: 
      chicken(e); 
      break; 
     case 94: 
      squid(e); 
      break; 
     case 95: 
      wolf(e); 
      break; 
     case 96: 
      moosh(e); 
      break; 
     case 97: 
      snowGolem(e); 
      break; 
     case 98: 
      ocelot(e); 
      break; 
     case 99: 
      ironGolem(e); 
      break; 
     case 120: 
      villager(e); 
      break; 
     case 200: 
      crystal(e); 
      break; 
     default: 
      break; 
     } 
    } 
} 

由於我使用的是休息,所有我做的方法將不會被調用正確的?這會導致大量無意義的代碼被執行並浪費性能,而這種設計的整個目的是爲了更好的工作流程。

+0

它出現短路,所以沒有。 –

+1

你測試過了嗎? – akf

回答

2

你的假設是正確的。只有符合特定switch情況的代碼纔會執行​​。畢竟,switch語句是一個巨大的if-else if-else塊的替代品。

0

效率低下是您需要檢查所有情況的地方,除非您最後得到結果,例如200。您需要重新組織決策過程,以便至少在更頻繁的情況下運行得更快。雖然switch語句是由編譯器優化的,但如果有太多的東西需要比較,就不能做太多的事情。

從switch語句的角度來看,您是對的:如果它到達break語句,它會短路。

+1

這是絕對錯誤的:'switch'不是*編譯成if-then-else序列,它是一個跳轉表,可以快速處理兩個以及兩百個項目。 – dasblinkenlight

+0

我沒那麼說!跳轉表需要保留比較的順序,對於兩個項目的兩百個項目,它不能一樣快。 – n0rm1e

+0

通過將語句寫入字節碼的方式來保存順序,所以一旦跳轉完成,代碼就可以正常工作,不管有沒有中斷。隨着新案例的引入,速度幾乎不會降低 - 它仍然是「O(1)」。 – dasblinkenlight

2

在你的情況下,只有與切換語句具體匹配的項目因爲中斷而執行。如果沒有休息,第一場比賽將被稱爲,以及隨後的所有比賽。例如,代碼:

System.out.println("starting"); 

int i = 2; 
switch (i) { 
    case 1: 
     System.out.println(1); 
    case 2: 
     System.out.println(2); 
    case 3: 
     System.out.println(3); 
} 

System.out.println("finished"); 

產生以下輸出:

starting 
2 
3 
finished 
相關問題