【问题标题】:How to write Builder Pattern for class that extends abstract class in Java?如何为在 Java 中扩展抽象类的类编写构建器模式?
【发布时间】:2022-01-19 09:30:28
【问题描述】:

我有一个扩展抽象类“用户”的“客户端”类:

public abstract class User {
    private Long id;
    private String firstName;
    private String lastName;
    private String email;

   //getters and setters
}

public class Client extends User{
    private List<Account> accountList;

    //getters and setters
}

我已经为“客户端”类编写了构建器,但是我无法访问用户的字段(id、firstName、lastName、email)以在构建中使用它。怎么做?

public class Client extends User {
    private List<Account> accountList;

    public static Builder builder() {
        return new Client().new Builder();
    }


    public class Builder {
        private Builder() {
        }

        public Builder setAccountList(List<Account> accountList) {
            Client.this.accountList = accountList;
            return this;
        }

        public Client build() {
            return Client.this;
        }
    }
}

【问题讨论】:

  • 使它们受到保护而不是私有,以授予对派生类的访问权限。
  • 使用您遗漏的 getter 和 setter,而不是尝试直接访问字段...
  • 你可以创建一个User.Builder 类,你的Client.Builder 可以继承

标签: java inheritance design-patterns abstract builder


【解决方案1】:

这是解决办法:

 public final class Client extends User {
        private List<Account> accountList;
    
        public List<Account> getAccountList() {
            return accountList;
        }
    
        public void setAccountList(List<Account> accountList) {
            this.accountList = accountList;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Client client = (Client) o;
            return Objects.equals(accountList, client.accountList);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(accountList);
        }
    
        public static Builder builder() {
            return new Client().new Builder();
        }
    
        public class Builder {
            private Builder() {
            }
    
            public Builder accountList(List<Account> accountList) {
                Client.this.accountList = accountList;
                return this;
            }
    
            public Builder id(Long id) {
                Client.this.setId(id);
                return this;
            }
    
            public Builder firstName(String firstName) {
                Client.this.setFirstName(firstName);
                return this;
            }
    
            public Builder lastName(String lastName) {
                Client.this.setLastName(lastName);
                return this;
            }
    
            public Builder email(String email) {
                Client.this.setEmail(email);
                return this;
            }
    
            public Builder password(String password) {
                Client.this.setPassword(password);
                return this;
            }
    
            public Builder role(User.Role role) {
                Client.this.setRole(role);
                return this;
            }
    
            public Builder dateOfBirth(LocalDate dateOfBirth) {
                Client.this.setDateOfBirth(dateOfBirth);
                return this;
            }
    
            public Client build() {
                return Client.this;
            }
        }
    }

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2019-01-22
  • 2016-04-25
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多