gpt4 book ai didi

Java - 来自构造函数的 setter

转载 作者:行者123 更新时间:2023-12-03 21:16:40 24 4
gpt4 key购买 nike

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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com