2013-11-03 85 views
0

我在這裏問了這個問題(想着我會幫助人們)Creating an unnecessary getter並且發現了我的一大片無知區域。忽略作爲參數傳入的值

this answer有人向我指出,我在我的代碼的致命缺陷,我引述爲方便:


「這是錯誤的:

public Patient(final String ptNo, final String ptName, 
     final String procDate, final int procType, final String injury, 
     final String drName) throws IOException 
{ 
    Patient.ptNo = getPtNo(); 
    Patient.ptName = getPtName(); 
    Patient.procDate = getProcDate(); 
    Patient.procType = getProcType(); 
    Patient.injury = getPtNotes(); 
    Patient.drName = getDrName(); 
} 

當你完全忽略作爲參數傳遞的所有值,而是:

public Patient(final String ptNo, final String ptName, 
     final String procDate, final int procType, final String injury, 
     final String drName) throws IOException 
{ 
    Patient.ptNo = ptNo; 
    Patient.ptName = ptName; 
    Patient.procDate = procDate; 
    Patient.procType = procType; 
    Patient.injury = injury; 
    Patient.drName = drName; 
} 

在這裏,你在設置喲ur class的字段與參數值。「


我不明白,爲什麼值被忽略。我呼籲單獨的方法,例如:

public static String getPtName() 
{ 
    System.out.print("Enter patient name: \n"); 
    try 
    { 
     ptName = stdin.readLine(); 
    } catch (IOException e) 
    { 
     System.out.println("Error! Enter a valid option."); 
     getPtName(); 
    } 
    return ptName; 
} 

所以我認爲這是相同的,用更長的方式寫第二塊代碼。

有人可以向我解釋,爲什麼它不同?從單


編輯 分配的要求。

c)爲接受的患者編號 (字符串),患者姓名(字符串),程序日期(在 格式DD/MM/YY一個字符串),程序的類的構造類型(一個int),傷害描述(一個 字符串)和正在管理患者治療的醫生的醫生名稱。

此構造函數應該初始化與已在已經過去的 相應的參數值的實例變量 - 它應該 也初始化病人筆記實例變量到在最初通過並初始化病人 狀態實例的傷害 描述變量爲'S'(表示新患者有 已安排程序)。

public Patient (String patientNo, String patientName, 
       String procedureDate, int procedureType, 
       String injuryDescription, String doctorName) 

d)實施對病人數量,患者姓名, 程序日期,患者筆記和醫生的名字實例變量的訪問器。

+1

哇,通過「公約」一個getter返回去'ptName'不是輸入鍵盤問,這就是問題所在。第二點是你在構造函數中以這種方式將屬性設置爲靜態變量,即使在你創建的實例中也是如此! – nachokk

+0

您對OOP的理解似乎存在許多深刻的差距,這超出了本論壇的討論範圍。找到一些在線教程並閱讀,閱讀和閱讀。 – Bohemian

+0

@EelLee因爲我們有無盡的討論,原來的問題是要求不同的事情。您是否閱讀過問答和評論? –

回答

2

在第一個例子:

public Patient(final String ptNo, final String ptName, 
       final String procDate, final int procType, 
       final String injury, final String drName) 
       throws IOException 

構造從未使用了在傳遞的變量也就是說,他們不函數體內的任何地方出現。

這是特別混亂,因爲參數的函數具有完全相同的名稱作爲類變量,但Patient.ptNo相同的變量作爲參數ptNo。 (實際上,Patient.ptNo應該是this.ptNo,因爲它屬於這個類的特定實例。Patient.ptNo會指單一值是常見的Patient類型。所有對象)當你寫經校正的形式

this.ptNo = ptNo; 

您正在設置變量與參數變量的值相同。實際上,在這種情況下,您必須必須限定類變量,否則將使用參數變量。

一些程序員遵循約定,例如爲所有類變量的名稱添加前綴或後綴,以使這些名稱衝突不可能發生。因此,舉例來說,你可能有

this.c_ptNo = ptNo; 

或只是

c_ptNo = ptNo; 

其中c_前綴表示類變量。

+0

添加到你的答案這不是一個好方法在這種情況下使用'static'變量。根本沒有意義。 – nachokk

+0

對不起;我不跟着你。哪個變量是'靜態'? –

+0

@AdamLiss ty,我處於眼淚的邊緣,在評論中被拆除(它的意思很好)。我只是覺得它很難切換語言,而且一旦我掌握了更加理解什麼的概念,條款的意思..它的工作。 :(我們都學習不同,我是46,所以拿起新東西比20歲時更困難.. thnx對你的幫助 –

1
public Patient(final String ptNo, final String ptName, 
        final String procDate, final int procType, final String injury, 
        final String drName) throws IOException 

您忽略了傳遞給構造函數的所有值。如果您希望用戶手動輸入值,可以使用無參數構造函數來完成。

public Patient() { 
    /*your code*/ 
} 

您的原始代碼要求創建Patient對象時傳入的所有信息。

這就是說,你不應該在構造函數調用中接受用戶輸入。你應該讓標準的getter和setter來處理這些領域。

Patient.<whatever>應該只是this.<whatever>

+0

我不認爲它是,我認爲你真的需要打這些書,因爲你不知道你是什麼談論。 – redFIVE