【问题标题】:Many parameters in java constructor [duplicate]java构造函数中的许多参数[重复]
【发布时间】:2018-04-12 10:04:06
【问题描述】:

您好,我是 java 的初学者。

在我的 BookLibrary 程序中创建具有许多参数的构造函数是一种好方法吗?

public class Book implements Serializable {

private String title;
private String directorName;
private String directorSurname;
private String type;
private int issueYear;
private List<String> actorNames;
private List<String> actorSurnames;
private Tuple<String, String> directorFullName;


public Book(String title, String directorName, String directorSurname, String type, int issueYear,
            List<String> actorNames, List<String> actorSurnames, Tuple<String, String> directorFullName){
    this.title = title;
    this.directorName = directorName;
    this.directorSurname = directorSurname;
    this.type = type;
    this.issueYear = issueYear;
    this.actorNames = actorNames;
    this.actorSurnames = actorSurnames;
    this.directorFullName = directorFullName;
}

或者有没有更好的办法来创建这样的构造函数?

【问题讨论】:

  • 首先检查你的逻辑。书籍没有导演和演员,因此添加其中任何一个都不合逻辑。
  • 让 setter 每个 setter 返回 this 并且在设置字段时,您可以链接这些 setter。如果有一些必填字段,没有哪个对象没有意义,那么您可以对这些字段使用构造函数,而其余的则使用 setter 方法,或者您也可以使用 Builder 模式
  • 在这种情况下您应该考虑使用构建器设计模式

标签: java constructor


【解决方案1】:

正如其他人在 cmets 中所说的那样,使用 Builder 模式将是一种选择。但如果做得不好,就会带来创建不完整对象的风险。

但是还有更多方法可以改进您的设计。例如。您将姓名和姓氏(以及导演的全名 - 为什么只有那里?)作为单独的字符串传递。我会创建一个 PersonName 类来封装这些不同的命名元素,因此您的构造函数变为:

public Book(String title, 
            PersonName directorName, 
            String type, 
            int issueYear,
            List<PersonName> actors) {
    ...
}

看起来更好,并使命名问题更加一致。

当然,将该类重命名为 Movie 而不是 Book。

【讨论】:

  • 您只需重复副本中的答案即可。您可以轻松检查,因为我在您发布答案前 10 分钟标记了它。请不要回答明显的重复
【解决方案2】:

创建具有超过 3 个参数的构造函数不是最佳实践。因为你需要知道每个参数的顺序。我可以建议您以这种方式使用 getter 和 setter(对于类的 title 字段):

public String getTitle() {
    return title;
}

public Book setTitle(String title) {
    this.title = title;
    return this;
}

通过这种结构,您可以在创建新实例的同时创建非常漂亮的构造:

Book book = new Book()
            .setTitle("Book")
            .setType("Comedy")
            .setActorNames(Arrays.asList("Abzal"));

你的类的完整重构版本:

public class Book implements Serializable {
private String title;
private String directorName;
private String directorSurname;
private String type;
private int issueYear;
private List<String> actorNames;
private List<String> actorSurnames;
private Tuple<String, String> directorFullName;

public Book() {
}


public String getTitle() {
    return title;
}

public Book setTitle(String title) {
    this.title = title;
    return this;
}

public String getDirectorName() {
    return directorName;
}

public Book setDirectorName(String directorName) {
    this.directorName = directorName;
    return this;
}

public String getDirectorSurname() {
    return directorSurname;
}

public Book setDirectorSurname(String directorSurname) {
    this.directorSurname = directorSurname;
    return this;
}

public String getType() {
    return type;
}

public Book setType(String type) {
    this.type = type;
    return this;
}

public int getIssueYear() {
    return issueYear;
}

public Book setIssueYear(int issueYear) {
    this.issueYear = issueYear;
    return this;
}

public List<String> getActorNames() {
    return actorNames;
}

public Book setActorNames(List<String> actorNames) {
    this.actorNames = actorNames;
    return this;
}

public List<String> getActorSurnames() {
    return actorSurnames;
}

public Book setActorSurnames(List<String> actorSurnames) {
    this.actorSurnames = actorSurnames;
    return this;
}

public Tuple<String, String> getDirectorFullName() {
    return directorFullName;
}

public Book setDirectorFullName(Tuple<String, String> directorFullName) {
    this.directorFullName = directorFullName;
    return this;
}

}

好好编码!

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 2010-09-18
    • 2019-03-02
    • 2011-03-22
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多