i-l*_*ink 7 java methods setter constructor
得到一个我遇到的问题
public class Student{
private String studentNumber;
private String studentName;
private double studentResult;
public Student (String aNumber, String aName){
setStudentNumber(aNumber);
setStudentName(aName);
setStudentResult(0);
}
// The standard getter and setter method are define here.
}
Run Code Online (Sandbox Code Playgroud)
在构造函数中使用setter方法的目的是什么?并且使用setStudentResult(0),我们需要另一个实例变量吗?
调用可重写方法是一种反模式,如果学生被重写,则可能会引起问题。一个好的模式是使学生一成不变
public class Student{
private final String studentNumber;
...
public Student (String studentNumber, ...) {
this.studentNumber = studentNumber;
...
Run Code Online (Sandbox Code Playgroud)
sent当您处理(您发送的)值的验证时,您将必须使用上述代码实践。
例如,如果您不想允许studentNUmber在构造函数中将任何负数设置为 a,那么您必须编写一个逻辑来检查构造函数内部或方法内部的数字,具体取决于类是不可变的还是可变的。如果类是可变的,则在方法内部编写逻辑;如果类是不可变的,则在构造函数内部编写逻辑(在不可变类中不允许编写 setter 方法,因为 setter 方法可以更改对象的状态)。
如果您不应用这样的逻辑,则可以将任何负值设置为studentNumber。
此外,当您在其他类中创建了一个对象,并且稍后您想要更改它的状态(例如,您想要更新学生的姓名)时,setter 方法非常有用,如下例所示,
public class Student {
private String studentNumber;
private String studentName;
private double studentResult;
// The standard getter and setter method are define here.
public Student(String aNumber, String aName) {
studentNumber = aNumber;
studentName =aName;
}
public String getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(String studentNumber) {
this.studentNumber = studentNumber;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public double getStudentResult() {
return studentResult;
}
public void setStudentResult(double studentResult) {
this.studentResult = studentResult;
}
@Override
public String toString() {
return "studentNumber:"+studentNumber+", studentName"+studentName+", studentResult"+studentResult;
}
}
class Test {
public static void main(String[] args) {
Student s = new Student("1", "AAA");
s.setStudentName("BBB"); //we should call this method because of "studentName" is private variable in Student class.
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
about setStudentResult,您不需要再有另一个实例变量,因为它已经在Student类中声明了。相反,您需要在构造函数中再添加一个参数来setStudentResult赋值。
public Student(String aNumber, String aName, long result) {
studentNumber = aNumber;
studentName =aName;
studentResult =result;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2560 次 |
| 最近记录: |