代码之家  ›  专栏  ›  技术社区  ›  Dawid

java构造函数中的许多参数[重复]

  •  0
  • Dawid  · 技术社区  · 7 年前

    嗨,我是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;
    }
    

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   Ralf Kleberhoff    7 年前

    正如其他人在评论中所说,使用Builder模式将是一种选择。但如果操作不当,则会带来创建不完整对象的风险。

    但是有更多的方法可以改进您的设计。E、 g.你传递名字和姓氏(如果是导演,则传递全名-为什么只有在那里?)作为单独的字符串。我会创建一个 PersonName 类,该类封装了这些不同的命名元素,因此您的构造函数成为:

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

    外观更好,命名问题更一致。

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

        2
  •  1
  •   Abzelhan    7 年前

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

    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;
    }
    

    }

    有一个好的编码!