Java - 来自构造函数的 setter

标签 java constructor setter

package cen.col.course.demo;

import java.io.Serializable;

public class Course implements Serializable {

private static final long serialVersionUID = 1L;
protected String code;
protected String title;
protected Professor professor;

public Course( String code) throws InvalidDataException {
    super();
    setCode(code);
}

public Course(String code, String title ) throws InvalidDataException  {
    this(code);
    setTitle(title);
}

public Course(String code, String title, Professor professor) throws InvalidDataException   {
    this(code,title);
    setProfessor(professor);
}
    public String getCode() {
    return code;
    }

protected void setCode(String code) throws InvalidDataException {
    if ( code == null || code.length() < 1) {
        throw new InvalidDataException("Course must have a course code");
    }
    this.code = code;
}

public String getTitle() {
    return title;
}

public void setTitle(String title)  throws InvalidDataException {
    if ( title == null || title.length() < 1) {
        throw new InvalidDataException("Course must have a title");
    }
    this.title = title;
}

public Professor getProfessor() {
    return professor;
}

public void setProfessor(Professor professor) {
    this.professor = professor;
}

public String toString() {
    String output = getCode() + ": [" + getTitle() + "]";
    if (getProfessor() != null ) {
        output += " is taught by " + getProfessor();
    }
    return output;
}

public boolean equals(Course c) {
    if ( ! this.getCode().equals(c.getCode())){
        return false;
    }
    if ( ! this.getTitle().equals(c.getTitle())){
        return false;
    } 
    // should the prof field be included in test for equality?
    if ( ! this.getProfessor().equals(c.getProfessor())){
        return false;
    } 
    return true;
}


}

我有三个问题:
  • 我注意到我的教授从构造函数中调用了 setter 方法。我做了一些搜索,对此有不同的想法。有人说没关系,有人说使用子类时要小心,可以从构造函数中调用setter吗?
  • 构造函数抛出异常,因为她正在从构造函数调用 setter。现在我的问题是,如果从构造函数调用 setter 不是一种安全的方法,那么正确的方法是什么?我的猜测是声明一个无参数构造函数,并使用 setter 构建对象。
  • 我想这样做,是不可能的?

    Course createCourse = new Course("1234","Programming 1","Pam Halpert");

  • 我正在调用带有 3 个参数的构造函数,但是,如果从构造函数调用 setter 是不安全的,那么将如何执行此操作并设置异常?我可以使用 if 语句吗?检查某些内容是否为空白并在必要时抛出异常?

    最佳答案

  • 在构造函数中调用 setter 通常具有以下优点:有时 setter 内部已经有一些验证逻辑(例如您的示例中的 setTitle),并且您不想复制此逻辑。但是,正如您已经提到的,调用 setter 可能会导致问题,即子类可能会以意外行为覆盖它们。要解决这个问题,您可以将 setter 设为私有(private)或最终设置,这样它们就不会被覆盖。仅调用私有(private)/最终 setter 是一种很好的做法,不应导致任何问题。
  • 获取无效数据的构造函数抛出异常很好。您不想创建无效对象。
  • 首先创建一个空对象(通过空构造函数)然后通过 setter 填充其数据是相当糟糕的做法。这样一来,您将有一段时间处于无意义状态的对象,其中一些数据已填充,一些数据未填充,这可能会导致麻烦。另外,正如已经提到的另一个答案,您应该考虑减少构造函数的数量-没有教授的类(class)真的有效吗?如果没有,则不需要构造函数来创建这样的对象...
  • 关于Java - 来自构造函数的 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12533247/

    相关文章:

    php - 无法引用类 __construct() 中设置的 PDO 实例

    wpf - 为什么我不能在样式内设置数据模板,但可以在控件模板内设置?

    Ruby:数组的 attr_reader 类能够提供对数组值的写访问权限吗?

    java - 如何为获取文件和值参数的本地应用程序创建 docker 镜像

    java - final 字段的初始化顺序

    java - 是否可以使用仅在使用此枚举时定义的变量创建枚举?

    OOP:setter 应该是私有(private)的吗?

    Java-在while循环中递减变量并打印列表

    Java 中的 C# DateTime.Ticks 等效项

    java - 在Java多态性中,所有实现接口(interface)的类都可以创建为该类型接口(interface)吗?