0

我在这里问了这个问题(以为我会帮助人们) 创建一个不必要的吸气剂并挖掘出我所拥有的巨大无知领域。

这个答案中,有人向我指出我的代码有一个致命的缺陷,为了方便起见,我引用了:


“这是错误的:

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 格式的字符串)、手术类型(整数)、受伤描述的类提供构造函数(一个字符串)和对患者进行治疗的医生的医生姓名。

此构造函数应使用已传入的相应参数值初始化实例变量 - 它还应将患者注释实例变量初始化为最初传入的损伤描述,并将患者状态实例变量初始化为“S”(表示新患者已安排了程序)。

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

D) 实现患者编号、患者姓名、手术日期、患者笔记和医生姓名实例变量的访问器。

4

2 回答 2

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;

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

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

this.c_ptNo = ptNo;

要不就

c_ptNo = ptNo;

其中c_前缀表示一个类变量。

于 2013-11-03T23:59:15.657 回答
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>

于 2013-11-03T23:59:54.390 回答