Construção de Objetos

5 respostas
F

O que pensam dessa solução para construir um objeto que seja complexo.

public class Veiculo {
   private  String modelo;
   private  String marca;
   private  String cor;
   public String toString(){
	   return modelo+" "+marca+""+cor;
   }
   protected Veiculo(String modelo,String marca,String cor){
	   this.marca=marca;
	   this.cor=cor;
	   this.modelo=modelo;
   }
   public static class Builder{
	   private  String modelo;
	   private  String marca;
	   private  String cor;
	   public  Builder modelo(String m){
			  modelo=m;
			  return this;
	   }
	   public  Builder marca(String m){
		  marca=m;
		  return this;
	   }
	   public  Builder cor(String m){
			  cor=m;
			  return this;
	   }
	  public Veiculo criar(){
		  return new Veiculo(modelo,marca,cor);
	  }
   }

}
public class Main {
	//http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern
	//Para amenizar o problemas de ter varioas seters e não saber quando o objeto está pronto!
	public static void main(String[] args) {
		Veiculo veiculo= new Veiculo.Builder().cor("verde").marca("X").modelo("Y").criar();
		System.out.println(veiculo);
	}

}

Os argumentos usados nessa discussão são:
1)O uso de vários seters para a criação de objetos complexos com alto número de parâmetros não deixa claro se o objeto foi criado adequadamente.
2)Vários construtores sobrecarregados também deixam o código puco legível.
3)A construção fica a cargo de um objeto chamado Builder diminuindo assim o baixo acoplamento.
Concordam :?:

5 Respostas

pmlm

Isso é o Pattern Method Chaining.

O StringBuilder, por exemplo, implementa este pattern.

Mais info.

F

pmlm:
Isso é o Pattern Method Chaining.

O StringBuilder, por exemplo, implementa este pattern.

Mais info.


Boa, como vi o afixo Builder achavo que se fazia referência ao padrão Builder e que na prática não parece ter muito a ver

pmlm

Não precisas da classe Builder. Neste caso podes ter simplesmente:

public class Veiculo {  
    private String modelo;  
    private String marca;  
    private String cor;  
       
    public String toString(){  
        return modelo+" "+marca+" "+cor;  
    }  
              
    public Veiculo modelo(String m){  
        this.modelo=m;  
        return this;  
    }  
           
    public Veiculo marca(String m){  
        this.marca=m;  
        return this;  
    }  

    public Veiculo cor(String m){  
        this.cor=m;  
        return this;  
    }  
}  
      

public class Main {  
    public static void main(String[] args) {  
        Veiculo veiculo= new Veiculo().cor("verde").marca("X").modelo("Y");  
        System.out.println(veiculo);  
    }  
      
}
F
pmlm:
Não precisas da classe Builder. Neste caso podes ter simplesmente:
public class Veiculo {  
    private String modelo;  
    private String marca;  
    private String cor;  
       
    public String toString(){  
        return modelo+" "+marca+" "+cor;  
    }  
              
    public Veiculo modelo(String m){  
        this.modelo=m;  
        return this;  
    }  
           
    public Veiculo marca(String m){  
        this.marca=m;  
        return this;  
    }  

    public Veiculo cor(String m){  
        this.cor=m;  
        return this;  
    }  
}  
      

public class Main {  
    public static void main(String[] args) {  
        Veiculo veiculo= new Veiculo().cor("verde").marca("X").modelo("Y");  
        System.out.println(veiculo);  
    }  
      
}
É aí que tá o cerne do negocio! A classe Builder vem para encapsular a criação. Dessa forma existe um "controle/assinatura/contrato" sobre forma que foi projetada a instanciação da classe! Por isso que é necessário fazer a chamada no final das inserções dos parâmetros, veja;
public Veiculo criar(){  
          return new Veiculo(modelo,marca,cor);  
      }
Se algum outro desenvolvedor pegar essa classe ele saberá que para instanciá-la corretamente, a classe deverá passar por etapas obrigatórias já previamente definidas! Isso é bom pois previne possíveis bugs no futuro! Compreendeu :?:
F

Acrescentado

Veiculo veiculo= new Veiculo.Builder().cor("verde").marca("X").modelo("Y").criar();

Esse .criar() que é a questão e como está no final pelo que li nas discussões da galera é para criar uma especie de regra de construção da classe.
Ou seja para ter um veiculo eu preciso de uma cor, marca, ect…ok…agora posso criar um! Tome!

Criado 16 de maio de 2012
Ultima resposta 16 de mai. de 2012
Respostas 5
Participantes 2