构造函数中的setter方法

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),我们需要另一个实例变量吗?

Evg*_*eev 5

调用可重写方法是一种反模式,如果学生被重写,则可能会引起问题。一个好的模式是使学生一成不变

public class Student{
    private final String studentNumber;
    ...
    public Student (String studentNumber, ...) {
       this.studentNumber = studentNumber;
    ...
Run Code Online (Sandbox Code Playgroud)


Ami*_*itG 1

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)