Динамический шаблон построителя

90
14

Ниже приведен базовый шаблон построения

enum AccountType {
BASIC,PREMIUM;
}

class AccountBuilder {
private AccountBuilder(Builder builder) {}

private static class PremiumAccountBuilder extends Builder {
public PremiumAccountBuilder () {
this.canPost = true;
}

public PremiumAccountBuilder image(Image image) {
this.image = image;
}
}

public static class Builder {
protected String username;
protected String email;
protected AccountType type;
protected boolean canPost = false;
protected Image image;

public Builder username(String username) {
this.username = username;
return this;
}

public Builder email(String email) {
this.email = email;
return this;
}

public Builder accountType(AccountType type) {
this.type = type;
return (this.type == AccountType.BASIC) ?
this : new PremiumAccountBuilder();
}

public Account builder() {
return new Account (this.name,this.email,this.type, this.canPost, this.image);
}

}
}

поэтому премиум-аккаунт в основном переопределяет canPost и может установить изображение.

Я не уверен, могу ли я сделать что-то вроде

Account premium = new AccountBuilder.Builder().username("123").email("123@abc.com").type(AccountType.PREMIUM).image("abc.png").builder();

например, после вызова метода type если это премиальная учетная запись, тогда я смогу сделать вызов метода image.

Это дает мне ошибку, поскольку она не может распознать и найти метод изображения. Я не уверен, что это правильный способ сделать это или нет, или есть лучший способ сделать это?

спросил(а) 2021-01-28T00:16:21+03:00 4 месяца, 3 недели назад
1
Решение
64

accountType возвращает объект типа Builder, который не имеет метода image. Возможным решением является добавление метода image в класс Builder который просто игнорирует Image, которое затем переопределяется методом image PremiumBuilder когда он может сделать что-то полезное с Image; альтернативой является передача Image в метод accountType, который затем отвечает за передачу Image в конструктор PremiumBuilder

ответил(а) 2021-01-28T00:16:21+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема