2014-09-28 108 views
1

我目前正在研究一個涉及創建一個對象數組的項目(在這種情況下,創建的ToolItem類中的硬件工具),然後創建一個類文件操縱這些數據。我現在創建的類名爲HardwareStore,它具有搜索,插入和刪除數組中項目的私有數據成員的方法。使用前面提到的ToolItem類中名爲assign()的方法,我爲每個數據成員調用set方法,並將它們分配給數組中的一個點。分配是這樣的:試圖瞭解true/false格式的設置方法的數據驗證

public void assign(int quality, String name, int id, int numInStock, double price) 
    { 
     setQuality(quality); 
     setToolName(name); 
     setID(id); 
     setNumberInStock(numInStock); 
     setPrice(price); 
    } 

我的插入方法目前的樣子:

public int insert(int quality, String name, int id, int numInStock, double price) 
    { 
     //testing the unique ID passed by the user, 
     //making sure there isn't an object in the 
     //array with the same ID 
     testArray = searchArray(id); 

     //array holds a max of 10 objects 
     if (numberOfItems == 10) 
     { 
      System.out.println("Array is full"); 
      return 0; 
     } 
     //-1 is sentinel value from search method, 
     //telling me there isn't an object with the 
     //same specified ID 
     else if (testArray == -1) 
     { 
      for (index = 0; index < toolArray.length; index++) 
      { 
       if (toolArray[index].getToolID() == 0) 
       { 
        toolArray[index].assign(quality, name, id, numInStock, price); 
        numberOfItems++; //counter for array 
        return 1;   
       } 
      }//end for loop 
     } 
     return -1; //sentinel value telling me there was a dupe ID 

    }//end insert 

我應該以這種方式使用一個布爾變量來驗證toolArray[index].assign(quality, name, id, numInStock, price);,雖然:

boolean oK = toolArray[index].assign(quality, id, numInStock, price); 

如果oK == true,然後我增加數組中的項目數。爲了這個工作,我需要assign()返回類型boolean。這是如何解釋給我的:

是的,你會想要一個Assign方法。進入它的所有內容都是「設定」值到指定地點的呼叫。 assign方法將返回一個值,取決於值是否被賦值/插入。您需要檢查oK的值以確保其爲真或假。

我的問題是,我不知道如何將assign()返回類型更改爲boolean並使該方法正常工作。我首先想到的是這樣的:

if (setQuality(quality) == true) 
{ 
    return true; 
} 
else if (setToolName(name) == true) 
{ 
    return true; 
} 
else 
    return false; 

但這顯然並不在幾個編譯器錯誤工作和結果:/我只是不理解這種數據檢查背後的邏輯。如果有人瞭解這一點,並可以幫助我,我將不勝感激!

回答

1

好吧,考慮到你的賦值方法只包含setter方法,它將原始值或字符串賦值給內部字段,所以沒有太多可以出錯的地方,所以最簡單的方法來實現你想要的只是返回trueassign()末:

public boolean assign(int quality, String name, int id, int numInStock, double price) 
{ 
    setQuality(quality); 
    setToolName(name); 
    setID(id); 
    setNumberInStock(numInStock); 
    setPrice(price); 
    return true; 
} 

現在,如果你有一個是你的參數是非法的,例如用於ID爲名稱的負整數,或null特定值,您可以添加里面每個二傳手的檢查非法價值的方法。如果這些值通過,則可以拋出Exception,如IllegalArgumentException,或者即使您願意,也可以自定義異常。下面是它如何查找setID()方法:

void setID(int id) throws IllegalArgumentException { 
    if(id < 0) { 
     throw new IllegalArgumentException(); 
    } else { 
     this.id = id; 
    } 
} 

然後,假設所有的setter方法拋出同樣的異常,可以在try/catch塊添加到assign()方法並返回false如果任何setter方法收到的非法值。代碼如下所示:

public boolean assign(int quality, String name, int id, int numInStock, double price) 
{ 
    try { 
     setQuality(quality); 
     setToolName(name); 
     setID(id); 
     setNumberInStock(numInStock); 
     setPrice(price); 
    } catch (IllegalArgumentException iae) { 
     return false; 
    } 
    return true; 
} 

如果你的方法需要拋出不同的異常出於某種原因,那麼你就可以在catch塊像分離異常:

catch (ExceptionOne e1 | ExceptionTwo e2 ....) { 
    return false; 
} 

使用異常是確定。在這種情況下,,因爲這些值中的一個無效是一個系統邏輯故障,應該注意。非法的ID或名稱會破壞您的系統邏輯,因此應該使用適當的例外進行處理。此外,這可能永遠不會發生或很少發生,因此它將成爲程序邏輯的「例外」。

但是,例如,如果您有一個功能,要求用戶輸入他們想要的工具的名稱,並且用戶給了您一個無效的工具名稱,則不需要在那裏拋出異常,讓你的系統出現錯誤,那只是用戶不知道如何使用系統或者不知道他的工具名稱。在這種情況下,您可以返回錯誤值,如nullfalse。我改變了返回類型...從虛空

+0

感謝nem的快速反應!我即將快速測試它,看看它是否有效,但它絕對看起來應該是這樣!我的設置方法有自己的自定義異常(至少我認爲他們確實基於你說的)。例如,如果質量數據成員不在1和3之間,則將其設置爲0等。這是我的指示,雖然我喜歡你的方式更好:) – FuegoJohnson 2014-09-29 00:12:13

+0

@FuegoJohnson歡迎您:)。讓我知道如果你卡住 – nem035 2014-09-29 00:20:08

+0

非常感謝!在這個網站上需要更多像你一樣的人 – FuegoJohnson 2014-09-29 00:26:25

1

通知書布爾

public boolean assign(int quality, String name, int id, int numInStock, double price) 
    { 

    return 
     (setQuality(quality) && 
     setToolName(name) && 
     setID(id) && 
     setNumberInStock(numInStock) && 
     setPrice(price)) 
    } 

然後,我用一個條件改變了句子的通知。如果我說一個返回& & B檢查意味着,如果A和B都是真實的,它將返回true,那麼,下面這個邏輯,你構造整個句子的回報和保存自己很多的IFS ..

使用異常的流程控制結構是不好的做法和反模式。

+0

哇,我什至沒有想到這樣做!我喜歡簡單。感謝您容易理解的答案。我會測試它,看看它是如何工作的。非常感激! – FuegoJohnson 2014-09-29 00:16:32

+0

我收到一個編譯器錯誤,「運算符&&未定義爲參數類型void,void」:/ – FuegoJohnson 2014-09-29 00:23:03

+0

您需要更改每個setter方法以在這種情況下返回'boolean' – nem035 2014-09-29 00:23:41