忽略作为参数传入的值

时间:2013-11-03 23:55:27

标签: java parameters parameter-passing

我在这里问了这个问题(以为我会帮助别人) 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;
}

在这里,您要使用参数值设置班级的字段。“


我不明白的是,为什么忽略这些价值观。我称之为单独的方法,例如:

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;
}

所以我认为这是相同的,以更长的方式编写第二块代码。

有人可以向我解释,为什么会有所不同?


修改 来自uni。

的分配要求
  

C)为接受患者编号的类提供构造函数   (一个字符串),患者姓名(一个字符串),程序日期(一个字符串)   格式dd / mm / yy),程序类型(int),伤害描述(a   字符串)和管理医生的医生姓名   病人的治疗。

     

这个构造函数应该用。初始化实例变量   传入的相应参数值 - 它应该   还将患者注释实例变量初始化为损伤   最初传递的描述并初始化患者   状态实例变量为'S'(表示新患者有   有一个程序预定)。

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

D)为患者编号,患者姓名,   程序日期,患者注释和医生姓名实例变量。

2 个答案:

答案 0 :(得分:3)

在第一个例子中:

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;

您将 class 变量设置为与参数变量相同的值。实际上,在这种情况下,必须限定类变量,否则将使用参数变量。

一些程序员遵循约定,例如为所有类变量的名称添加前缀或后缀,以使这些名称冲突不可能发生。所以,例如,你可能有

this.c_ptNo = ptNo;

或只是

c_ptNo = ptNo;

其中c_前缀表示类变量。

答案 1 :(得分:2)

    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>