java构造函数中的许多参数

java构造函数中的许多参数,java,constructor,Java,Constructor,嗨,我是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>

嗨,我是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;
}
公共类书实现了可序列化{
私有字符串标题;
私有字符串directorName;
私有字符串directorSurname;
私有字符串类型;
私人国际发行人;
私有列表actorNames;
私人名单actorSurnames;
私有元组directorFullName;
公共图书(字符串标题、字符串directorName、字符串DirectorUrName、字符串类型、int issueYear、,
列表actorNames、列表actorSurnames、元组directorFullName){
this.title=标题;
this.directorName=directorName;
this.directorSurname=directorSurname;
this.type=type;
this.issueyar=issueyar;
this.actorNames=actorNames;
this.actorSurnames=actorSurnames;
this.directorFullName=directorFullName;
}

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

正如其他人在评论中所说的,使用生成器模式是一种选择。但是如果做得不好,这会带来创建不完整对象的风险

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

public Book(String title, 
            PersonName directorName, 
            String type, 
            int issueYear,
            List<PersonName> actors) {
    ...
}
公共书籍(字符串标题,
PersonName directorName,
字符串类型,
国际货币基金组织,
(列出演员名单){
...
}
外观更好,命名问题更一致


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

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

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

public Book(String title, 
            PersonName directorName, 
            String type, 
            int issueYear,
            List<PersonName> actors) {
    ...
}
公共书籍(字符串标题,
PersonName directorName,
字符串类型,
国际货币基金组织,
(列出演员名单){
...
}
外观更好,命名问题更一致


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

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

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

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;
}
公共类书实现了可序列化{
私有字符串标题;
私有字符串directorName;
私有字符串directorSurname;
私有字符串类型;
私人国际发行人;
私有列表actorNames;
私人名单actorSurnames;
私有元组directorFullName;
公共书籍(){
}
公共字符串getTitle(){
返回标题;
}
公共图书集标题(字符串标题){
this.title=标题;
归还这个;
}
公共字符串getDirectorName(){
返回directorName;
}
公共图书集directorName(字符串directorName){
this.directorName=directorName;
归还这个;
}
公共字符串getDirectorSurname(){
返回董事姓名;
}
公共图书集directorSurname(字符串directorSurname){
this.directorSurname=directorSurname;
归还这个;
}
公共字符串getType(){
返回类型;
}
公共图书集类型(字符串类型){
this.type=type;
归还这个;
}
public int getIssueYear(){
退票;
}
公共图书集发行人(国际发行人){
this.issueyar=issueyar;
归还这个;
}
公共列表getActorNames(){
返回actorNames;
}
公共图书集actorNames(actorNames列表){
this.actorNames=actorNames;
归还这个;
}
公共列表getActorSurnames(){
返回actorSurnames;
}
公共图书集actorSurnames(列出actorSurnames){
this.actorSurnames=actorSurnames;
归还这个;
}
公共元组getDirectorFullName(){
返回directorFullName;
}
公共图书setDirectorFullName(元组directorFullName){
this.directorFullName=directorFullName;
归还这个;
}
}


有一个好的编码!

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

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

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;
}
公共类书实现了可序列化{
私有字符串标题;
私有字符串directorName;
私有字符串directorSurname;
私有字符串类型;
私人国际发行人;
私有列表actorNames;
私人名单actorSurnames;
私有元组directorFullName;
公共书籍(){
}
公共字符串getTitle(){
返回标题;
}
公共图书集标题(字符串标题){
this.title=标题;
归还这个;
}
公共字符串getDirectorName(){
返回directorName;
}
公共图书集directorName(字符串directorName){
this.directorName=directorName;
归还这个;
}
公共字符串getDirectorSurname(){
返回董事姓名;
}
公共图书集directorSurname(字符串directorSurname){
this.directorSurname=directorSurname;
归还这个;
}
公共字符串getType(){
返回类型;
}
公共图书集类型(字符串类型){
this.type=type;
归还这个;
}
public int getIssueYear(){
退票;
}
公共图书集发行人(国际发行人){
this.issueyar=issueyar;
归还这个;
}
公共列表getActorNames(){
返回actorNames;
}
公众的