我在这里问了这个问题(以为我会帮助别人) 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)为患者编号,患者姓名, 程序日期,患者注释和医生姓名实例变量。
答案 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>