我遇到了一个问题
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.
}
在构造函数中使用setter方法的目的是什么?并且使用setStudentResult(0),我们需要另一个实例变量吗?
答案 0 :(得分:4)
调用可覆盖的方法是一种反模式,如果重写Student,可能会导致问题。一个好的模式是让学生不可改变
public class Student{
private final String studentNumber;
...
public Student (String studentNumber, ...) {
this.studentNumber = studentNumber;
...
答案 1 :(得分:3)
构造函数中setter的常见原因是您使用相同的验证。但是,自封装是一种反模式。
更好地完成你所写的是拥有一个构造对象并调用set方法的静态方法。比这更好的是让整个事情变得不可改变。
答案 2 :(得分:1)
当您处理sent
(您要发送的)值的验证时,您将不得不使用上述代码练习。
例如,如果您不希望允许任何负数从构造函数设置为studentNUmber
,那么您必须编写一个逻辑来检查构造函数内部或内部方法中的数字,具体取决于类是否为不可变的或可变的。如果class是可变的,那么在方法内写入逻辑,如果类是不可变的,那么在构造函数中写入逻辑(在不可变类中写入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);
}
}
关于setStudentResult
,您不需要另外一个实例变量,因为它已在Student
类中声明。相反,您需要在构造函数中将另外一个参数添加到setStudentResult
值。
public Student(String aNumber, String aName, long result) {
studentNumber = aNumber;
studentName =aName;
studentResult =result;
}
答案 3 :(得分:1)
您是否在setter方法中执行任何业务逻辑。如果是,我想这就是你从构造函数调用setter的原因。如果您只是在setter中部署实例变量,那么直接设置实例变量是正常的事情。
public class Student{
private String studentNumber;
private String studentName;
private double studentResult;
public Student (String aNumber, String aName){
this.studentNumber = aNUmber;
this.studentName=aName;
this.studentResult=0;
}
答案 4 :(得分:0)
从构造函数调用方法不是一个好主意。 构造函数用于设置字段的初始值。
如果你想从构造函数中调用方法,你不希望有人覆盖它。将该类声明为最终
答案 5 :(得分:0)
如前所述,在构造函数中使用setter方法并不是一个好主意,原因有两个:
子类可以覆盖它们,这可能会使对象处于未考虑的状态。
setter方法可以具有通常在构造函数中不需要的功能。
这样做的原因有两个:
最常见的是,如果在编写构造函数后生成setter / getters,IDE(例如eclipse)会自动执行此操作。
有时候setter方法也会在使用构造函数初始化时执行验证或格式化。在这种情况下,我建议将验证/格式化提取到另一个函数,并从构造函数和setter中调用该函数。