[Resolvido][Effective Java] Padrão de criação de objetos

5 respostas
Mr_Arthur

Pessoal,

Não lembro o nome do padrão de criação, porém sei como utiliza-lo.
Vou demonstrar aqui de forma simples a minha dúvida para ver se tem alguma solução.

abstract class Componente {

	String largura;
	String altura;

	public String getLargura() {
		return largura;
	}

	public String getAltura() {
		return altura;
	}

	public abstract static class Construtor {

		String largura;
		String altura;

		public Construtor comLargura(String largura) {
			this.largura = largura;
			return this;
		}

		public Construtor comAltura(String altura) {
			this.altura = altura;
			return this;
		}
	}
}
public final class Texto extends Componente {

	private Texto() {}

	String valor;

	public String getValor() {
		return valor;
	}

	public static class Construtor extends Componente.Construtor implements Montavel<Texto> {
		String valor;
		Boolean quebraDelinha;
		
		@Override
		public Texto montar() { // método da interface Montavel
			Texto texto = new Texto();
			texto.valor = valor;
			texto.largura = largura;
			texto.altura = altura;
			
			return texto;
		}

		public Construtor comValor(String valor) {
			this.valor = valor;
			return this;
		}
	}
}

Pessoal, o que eu gostaria aqui é de aproveitar os métodos definidos na Componente$Construtor.
Porém o que esses métodos me retornam é o Componente$Construtor que não tem acesso ao método montar() de Montavel.
Tentei colocar a Componente$Construtor para implementar a interface Montavel, porém não tive sucesso, pois o tipo Genérico teria que ser definido na classe Componente$Construtor.
Minha solução atual foi sobrescrever todos os métodos da classe Componente$Construtor em Texto$Construtor e mudar o seu tipo de retorno para Texto$Construtor.
Tem alguma forma em que eu não precisaria sobrescrever esses métodos na minha classe Construtor Filha?

Obrigado!

5 Respostas

Andre_Fonseca

oi,

você esta falando do Builder? usando o próprio exemplo do livro ficaria assim

package builder;

public class NutritionFacts {
	private final int servingSize;
	private final int servings;
	private final int calories;
	private final int fat;
	private final int sodium;
	private final int carbohydrate;
	public static class Builder {
		// Required parameters
		private final int servingSize;
		private final int servings;
		// Optional parameters - initialized to default values
		private int calories = 0;
		private int fat = 0;
		private int carbohydrate = 0;
		private int sodium = 0;
		public Builder(int servingSize, int servings) {
			this.servingSize = servingSize;
			this.servings = servings;
		}
		public Builder calories(int val) {
			calories = val;
			return this;
		}
		public Builder fat(int val) {
			fat = val;
			return this;
		}
		public Builder carbohydrate(int val) {
			carbohydrate = val;
			return this;
		}
		public Builder sodium(int val) {
			sodium = val;
			return this;
		}
		public NutritionFacts build() {
			return new NutritionFacts(this);
		}
	}
	private NutritionFacts(Builder builder) {
		servingSize = builder.servingSize;
		servings = builder.servings;
		calories = builder.calories;
		fat = builder.fat;
		sodium = builder.sodium;
		carbohydrate = builder.carbohydrate;
	}

	@Override
	public String toString() {
		return "NutritionFacts [servingSize=" + servingSize + ", servings="
				+ servings + ", calories=" + calories + ", fat=" + fat
				+ ", sodium=" + sodium + ", carbohydrate=" + carbohydrate + "]";
	}

	public static void main(String[] args) {
		NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
				.calories(100).sodium(35).carbohydrate(27).build();

		System.out.println(cocaCola);
	}
}
Mr_Arthur

é, mas a minha dúvida é como reaproveitar código do Builder com herança.

valeu.

Andre_Fonseca

oi,

O Builder é uma forma de você não precisar passar todos os parâmetros para o construtor ou então fazer os famigerados set’s de todas as variáveis. não vejo como “reaproveitar” o código já que você está apenas falando de construção do objeto

O que você poderia fazer é criar uma fabrica para gerar builders diferentes depedendo do tipo de objeto, seria isso que você precisa??

abs

Mr_Arthur

Tenho uma class A.
Tenho uma class B < A.
A tem seus atributos.
B também tem os seus e ainda os que herdou de A.
Consigo criar uma classe A apartir do seu Builder.
Como vou conseguir criar B apartir de um Builder também, sem ter que reescrever o código da Builder que já escrevi em A na class B? (e ainda assim preencher os valores que herdei de A).

Acho que está bem claro.

Mr_Arthur

Hmm, isso está resolvido. Só tinha esquecido de passar aqui e postar.

A resolução do problema se encontra aqui: http://www.tectura.com.br/topics/criando_objetos_com_padrao_builder

O Dentinho mandou ver com as genérics e resolveu o problema.

Valeu!

Criado 3 de maio de 2011
Ultima resposta 16 de abr. de 2012
Respostas 5
Participantes 2