构造函数中的setter方法

时间:2013-04-23 11:01:16

标签: java methods constructor setter

我遇到了一个问题

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

6 个答案:

答案 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方法并不是一个好主意,原因有两个:

  1. 子类可以覆盖它们,这可能会使对象处于未考虑的状态。

  2. setter方法可以具有通常在构造函数中不需要的功能。

  3. 这样做的原因有两个:

    1. 最常见的是,如果在编写构造函数后生成setter / getters,IDE(例如eclipse)会自动执行此操作。

    2. 有时候setter方法也会在使用构造函数初始化时执行验证或格式化。在这种情况下,我建议将验证/格式化提取到另一个函数,并从构造函数和setter中调用该函数。