Quando usar o construtor?

Aloha pessoas!!!

Tenho uma duvida simples. Como é que eu sei quando devo colocar um ou mais construtores em minha classe?

Quando quizer :lol:

Brincadeiras à parte, sobrescreva seu construtor sempre que achar ser interessante permitir a criação do objeto de diversas formas (com parâmetros diferenciados, com operações diferenciadas).

Eai galera !!

Kra neste caso vc nao precisa criar o construtor na classe nao pq o Java ja cria um cosntrutor automatico na sua classe. Mas caso vc quer criar e so qdo vc quer criar o objeto da classe usando parametros.
Lembrando: toda vez que vc criar um construtor passando parametros, vc tem que criar um outro contrutor vazio.

flw.

Brn… porque devo criar um vazio ? para manter valores default ? isso não seria uma opção minha ?

Errado. Construtores sem parâmetros não são necessários, muito menos obrigatórios.

Só se você quiser…

[quote=Brn_SI]Eai galera !!

Kra neste caso vc nao precisa criar o construtor na classe nao pq o Java ja cria um cosntrutor automatico na sua classe. Mas caso vc quer criar e so qdo vc quer criar o objeto da classe usando parametros.
Lembrando: toda vez que vc criar um construtor passando parametros, vc tem que criar um outro contrutor vazio.

flw.[/quote]

Algumas informações que acho interessante pra evitar confusões:
Quando o programador cria uma classe e não explicita nenhum construtor, o que o compilador irá fazer é criar um construtor assim:

//o que o programador declarou e compilador lê:
class MinhaClasse{
}
//o que o compilador gera:
class MinhaClasse{
    MinhaClasse(){
        super();
    }
}

Porém, se o programador declarar ao menos um construtor, o compilador não irá gerar construtor algum. Apenas a chamada para super() que poderá ser incluída (caso não exista nenhuma chamada para super() ou this(…)), mais ou menos assim:

//o que o programador declarou e compilador lê:
class MinhaClasse{
    MinhaClasse(int parametro){
        //operacoes quaisquer
    }

}
//o que o compilador gera:
class MinhaClasse{
    MinhaClasse(){
        super();
        //operacoes quaisquer
    }
}

Assim, se o programador definir um apenas construtor com parâmetros, as subclasses deverão efetuar chamadas explícitas a este construtor, pois a chamada super() criada não irá compilar (não existe construtor sem parâmetros).

Não existe a obrigação de criar um construtor sem parâmetros: o programador pode obrigar às demais classes informar parâmetros necessários à instanciação do objeto.

Um exemplo pratico de quando é util criar + de um construtor, neste caso, eu posso criar diretamente um CNPJ tanto de uma String, como de um Long, como de um BigInteger, fica a escolha de quem usar a classe… assim como posso converter o CNPJ para qualquer um destes tipos

vc usa quando facilitar para vc, com isso vc tira o trabalho de quem utiliza a classe de ele proprio ter que converter um BigInteger para String, ou um long para string para poder criar um Cnpj

[code] /**
* Constroi um CNPJ com valor nulo
* @see #isNull()
/
public Cnpj() {
super(null);
}
/
*
* Constroi um objeto {@link Cnpj} a partir de um {@link BigInteger}
*

*
Qualquer numero enviado, ela será devidamente tratada, invoca
* implicitamente {@link #toCnpjString(BigInteger)}, veja sua documentação para
* maiores detalhes.
* @see #toCnpjString(BigInteger)
* @param cnpj {@link BigInteger} contendo o valor do cnpj
*/
public Cnpj(BigInteger cnpj) {
super(toCnpjString(cnpj));

}
public Cnpj(Long cnpj) {
	super(toCnpjString(cnpj));
}
public Cnpj(String cnpj) {
	super(toCnpjString(cnpj));
}

//…
public BigInteger toBigInteger() {
return (isNull()) ? null : new BigInteger(toString());
}
public Long toLong() {
return (isNull()) ? null : new Long(toString());
}
public String toString() {
return super.toString();
}
[/code]

sim,

Mas obrigatóriamente o programador obriga que todos os objetos criados desta classe tera de passar atributos.
e se o mesmo nao quizer passar atributos diretamente ???

[code]public class teste(){

private String argumentos;

public teste(String argumentos){
	this.argumentos = argumentos;

}
public void setArg(String argumentos){

	this.argumentos = argumentos;
}

}[/code]

Class teste:

[code]public class testeTest(){

public static  void main (String args[]){
	
	//nao pode fazer assim
	teste t = new teste();

	// somente assim;
	teste t = new teste("Qualquer coisa");

}

}[/code]

:lol:

[quote=Brn_SI]sim,

Mas obrigatóriamente o programador obriga que todos os objetos criados desta classe tera de passar atributos.
e se o mesmo nao quizer passar atributos diretamente ???

[/quote]

mas tem caso que não passar parametro implica diretamente em deixar sem integridade a classe…

imagine a mesma classe que coloquei no exemplo, imagine que vc não queira nunca que existe Cnpj com valor null, para tal, vc obriga que o cara passe o número do Cnpj na hora de construir a classe…

exite varios exemplos onde isso é necessario, onde não se possa criar um construtor nulo, nem sempre um Set é aplicavél, por exemplo em Values Object isso não é permitido…

tente criar um new BigInteger() … que vc verá que não é possivel é preciso dizer qual o número deste biginteger para poder crialo! …e assim é a vida, tudo depe do que vc esta modelando…

Se pro teu sistema não existe Pessoa sem nome, vc pode obrigar que quando se crie uma pessoa, se informe o nome dela, justamente para manter a integridade