2015-10-17 46 views
2

我現在正在學java,對於一些練習,我正在爲一個小遊戲編程庫存。你有3個插槽,每個插槽都可以放置一個物品。「if」對於庫存中的每件商品,看起來都很難看

public boolean useItem(int place){ 
    //out of array request? 
    if (place > items.length) return false; 
    //empty inventory place? 
    if (items[place] == 0) return false; 

    if (items[place] == 1){ 
     //eat berrys 
     items[place] = 0; 
     return true; 
    } 
    if (items[place] == 2){ 
     //shoot arrow 
     items[place] = 0; 
     return true; 
    } 
    //item not there 
    return false; 
} 

它的工作原理,但感覺不好寫下越來越多的「如果」爲每一個項目。有誰知道更好的解決方案?

+2

使用'switch'語句 – knightrider

+1

您正在尋找的關鍵字是「多態性」。令人驚訝的是,迄今爲止還沒有人發表過答案,即使有兩個10k +的用戶。 – BalusC

+0

@knightrider實際上,沒有必要;) –

回答

1

if else樹的方法是switch聲明。

switch(items[place]) { 
    case 0: 
     return false; 
    case 1: 
     items[place] = 0; 
     return true; 
    case 2: 
     items[place] = 1; 
     return true; 
    default: 
     return false; 
} 

DEMO

+0

可憐的downvoter。 –

+0

@sᴜʀᴇsʜᴀᴛᴛᴀ也許他不喜歡某些人的想法,「switch」比「if」更好,因爲這不是事實。它可能具有較少的代碼行,但共享相同的缺點。但是,是的,他應該這樣寫,而不是默默地冷靜下來。 – Tom

+0

總是樂於討論和辯論!一個開關不會編譯成更高效的字節碼(請參閱[這裏](http://stackoverflow.com/questions/10836055/why-is-the-switch-statement-faster-than-if-else-for-string- in-java-7)),所以比if else樹稍微有點優勢。這也是我眼中更簡潔一點。它看起來更乾淨。 – christopher

0

這可以通過switch的情況來處理。這將是這樣的:

public boolean useItem(int place){ 
    //out of array request? 
    if (place > items.length) return false; 
    switch (items[place) { 
     case 0: //empty 
     default: 
     return false; 
     case 1: //eat berrys 
      items[place] = 0; 
     return true; 
     case 2: //shoot arrow 
      items[place] = 0 
     return true; 
    } 
    //item not there 
    return false; 
} 
5

Item item = items[place]; // by default you can have an EmptyItem that does nothing in the inventory when the place is empty

現在讓我們假設你有類似

interface Item { 
void use(); 
} 

class Berry implements Item{ 
    @Override 
    public void use(){ 
    //eating a a barry 
    } 
} 

class EmptyItem implements Item{ 
    @Override 
    public void use(){ 
    //do nothing 
    } 
} 

,那麼你將實現使用

0123內的方法的邏輯

我建議你創建你的庫存爲位更復雜的對象,而不是一個數組(複雜的對象可以使用數組組成本身)

想象有可以創建這樣一個庫存(通過它作爲一個參數的大小):

class Inventory{ 

    private Item[] items; 

    public Inventory(int size){ 
     items = new Item[size]; 
     // references are null by default, just making this explicit for op 
     for(int i = 0; i<size; i++){ 
      items[i] = null; 
     } 
    } 

    public void addItem(int space, Item item){ 
     // check for input params 
     // check array boundaries 
     // check for item in the selected space 
     if(items[space] == null){ 
      items[space] = item; 
     }else{ 
      // space not empty! 
     } 
    } 

    // I'd like more the approach of using get item -> item.use() :) 
    // but this is a bit more inline with op approach 
    public void useItem(int space){ 
     // check array boundaries 
     Item item = items[space]; 
     if(item != null){ 
      item.use(); 
     } 
    }  

    // keeping the null management inside the class itself 
    public Item getItem(int space){ 
     // check array boundaries   
     Item item = items[space]; 
     if(item == null){ 
     item = new EmptyItem(); 
     } 
     return item; 
    }  
} 

試想一下,您所建模是現實生活中的對象,想象他們是如何intefact彼此,並嘗試自己的屬性和行爲相應:)

1

我」模式d說使用自定義類對於項目,是這樣的:

class InventoryItems { 
    private HashMap<Integer, Integer> items = new HashMap<Integer, Integer>(); 

    public InventoryItems(final HashMap<Integer, Integer> items) { 
     this.items = items; 
    } 

    public boolean hasItem(final Integer index) { 
     return items.containsKey(index) && items.get(index) > 0; 
    } 

    public boolean useItem(final Integer index) { 
     if (!hasItem(index)) { 
      return false; 
     } 

     items.put(index, 0); 
     return true; 
    } 
} 

你在做什麼是沒有錯的只是使得它真的很難從長遠來看mentain。這泄漏了所有領域模型邏輯,因此您需要在任何時間點維護並意識到應用程序狀態的複雜功能代碼。

雖然爲了測試和學習的目的,我想其他人已經建議使用switchif檢查列表中的所有可能的項目。