Construtores - Duvida super básica!

[color=“blue”]Oi pessoal !!! Estava lendo no livro Core Java sobre construtores, mais não entendi a nessecidade dos mesmos… eu não poderia simplesmente instanciar objetos e inicializar variáveis no próprio main ? :idea:

Se eu entendi bem, a vantagem disso é que você pode separar os objetos que serão inicializados em construtores diferentes para que não seja necessário iniciar todos de uma vez… é isso ? :roll:

Valeu pessoal
SkyBlue[/color]

Imagine assim:

“VM, quando eu solicitar uma instancia nova dessa classe, quero que voce execute as tais linhas de codigo no momento do instanciamento”…

Construtores podem ser usados para iniciar variaveis com valores defaults, ou qualquer outro tipo de acao que voce pode fazer em metodos normais. Porem, nao eh comum nem muico aconselhavel deixar a logica no construtor, ao menos que voce tenha um otimo motivo para isso.

Por exemplo,

class MinhaClasse {
    private String nome;

    public MinhaClasse() {
        this.nome = "Sem nome";
    }
}

Assim, quando voce fizer

MinhaClasse c = new MinhaClasse();

a propriedade “nome” da classe tera como valor padrao a string “Sem nome”…

Claro que nada impede de voce setar o valor das variaveis em qualquer outra parte do codigo… o Construtor seria uma forma conveniente de fazer determinadas cosias "automaticamente’ no momento da cricao da classe.

Rafael

Cara, os construtores simplificam em muito as coisas…
Você pode ter objetos prontos para serem utilizados logo após a sua instanciação…

Algo como:

...

Funcionario meuFuncionario = new Funcionario(1, "Diogenes", "R$50.000");

...

Seria muito mais simples que…

...

Funcionario meuFuncionario = new Funcionario();
meuFuncionario.setId(1);
meuFuncionario.setNome("Diogenes");
meuFuncionario.setSalario("R$1.000");

...

Sem falar que eu ganharia muito mais com isso… :lol: :lol: :lol:

Diogenes, seu exemplo está certo mas prefiro dizer que os valores passados ao construtor devem ser de inicialização do objeto (como seu comportamento) e de variáveis. Substituir setters usando o construtor não é uma boa prática.

[color=“blue”]Oi pessoal !!! Valeu pelas dicas, mas acho que isso aí que você disse Diógenes viola o encapsulamento dos objetos… ou mesmo atributos. :?:

hehhe, você resolve um problema mais pelo que percebi provoca outro, mais de qualquer jeito valeu pelas dicas… ja deu pra ter uma idéia de como posso utilizar os contructors… :roll:

Valeu pessoal !!!
SkyBlue[/color]

Engraçado…Nunca ouví falar que seria uma má pratica fazer isso…é tão comum encontrar isso em outros códigos…

Mas agora a dúvida é minha…Pq seria uma má prática???

Seria isso q o Rafael citou???

Não acho que isso viola o encapsulamento. Vc poderia violar se criasse atributos publicos. Isso parece ser só uma má prática, só que confesso que já utilizei essa “má prática” algumas vezes.

Uma dessas situações foi quando precisei criar uma classe para um objeto que por determinado motivo não poderia ser alterado depois de instanciado, ou seja, a classe não teria setters. Nesse caso, o proprio construtor tratava de popular os atributos do objeto.

Como o nome diz o construtor deve servir para construir as propriedades básicas e iniciais de um objeto.
Usar métodos set e get realmente podem dar preguiça para escrever e usar, mas fica muito mais fácil para quem recebe apenas o .class e a documentação da sua classe. Para você que vai desenvolver a classe fica mais fácil e organizado para validar o que está entrando e saindo do objeto além de facilitar a divulgação de uma exceção específica para aquele caso em especial.

:wink:

é isso mesmo galera! perguntar e trocar experiência é inteligência

geralmente os livros usam este tipo de construção para facilitar o exemplo e o código ficar compacto.

Ok!

A partir de hoje getters e setters são meus amiguinhos!!!

Valeu galera!

:wink:

Acredito que a criação dos construtores parametrizados são muito úteis, mas pelo que vi no exemplo acima, uma coisa não substitui a outra: inclusive o construtor pode estar fazendo chamadas aos setters e getters respectivos, fazendo eventuais validações em um só lugar.
Mas uma dúvida: em Java é permitido um contrutor encaminhar chamadas a outro?

Sim. Você pode chamar tanto outros construtores da própria classe, como construtores da superclasse. Isso é feito dessa maneira:

[code]public class Base {
private String oneAttribute;
private String anotherOne;

public Base() {
    this("one", "another");
}

public Base(String one, String another) {
    this.oneAttribute = one;
    this.anotherOne = another;
}

}[/code]

Agora, chamando um construtor da superclasse:

[code]public class SpecialBase extends Base {
private String thirdOne;

public SpecialBase(String third) {
    super(); // chama construtor sem argumentos da superclasse
    this.thirdOne = third;
}

}[/code]

É isso aí! Espero que tenha ficado claro… :wink:

[]'s

tento fazer isso e obtenho um erro estranho de token.

public Diretorio(String path, String name){
       File f1 = new File(path);
       this(f1);
}	
public Diretorio(File f){...}

[quote=“rlicciardo”]tento fazer isso e obtenho um erro estranho de token.

public Diretorio(String path, String name){ File f1 = new File(path); this(f1); } public Diretorio(File f){...} [/quote]

Quando você usar this() ou super() dentro de um construtor deve ser sempre na primeira linha, portanto mude para:

public Diretorio(String path, String name){
       this(f1);
       File f1 = new File(path);
}	
public Diretorio(File f){...}

Oops… nesse seu método acho que não vai funcionar assim, você terá que revisá-lo… :wink:

No exemplo que eu dei o objeto passado como parametro é criado antes da chamada ao construtor devido. Isso funcionaria com o this antes?

Acho que a solução para seu problema pode ser esta:

public Diretorio(String path, String name){ this(new File(path)); } public Diretorio(File f){...}

“pior cego é aquele que não quer ver…”

Muito obrigado mesmo. A resposta estava bem na minha frente… rs