Construindo objetos e definindo valores inicias

Nos capítulos anteriores aprendemos que getters e setters são funções de uma classe. Em POO, funções dentro de classes são chamadas de métodos. Em Java, toda função deve estar obrigatoriamente dentro de uma classe, assim, as funções criadas até agora são métodos.

Podemos criar métodos adicionais para realizar outras tarefas como verificar se o CPF do cliente é válido. A estrutura básica para criação de funções foi apresentada ao criarmos getters e setters.

Adicionalmente, podemos ter um tipo específico de método que é responsável por criar objetos e inicializar seus atributos. Utilizando a classe Cliente na qual estamos trabalhando, poderíamos definir que determinados atributos devam receber um valor no momento em que um objeto for criado, para garantir que tais atributos terão um valor definido.

Por exemplo, poderíamos considerar que o nome, CPF e sexo de um cliente são obrigatórios e assim, inicializar tais atributos quando um cliente for criado.

Para tal finalidade, podemos criar métodos especiais que chamamos de construtores.

Um construtor é um método utilizado por uma classe para criar objetos dela. Em linguagens orientadas a objetos, se um construtor não for definido pelo desenvolvedor, um construtor padrão é automaticamente incluído quando a classe é compilada.

O construtor tem a mesma estrutura de um método, com pequenas excessões que fazem o compilador entender que ele é um construtor. Primeiramente, o nome do construtor deve obrigatoriamente ser igual ao nome da classe, inclusive com inicial maiúscula. Segundo, o construtor não retorna um valor. Você lembra que os setters também não retornam valor e assim o tipo de retorno é void. Mas no caso dos construtores, simplesmente deve-se omitir o tipo de retorno. Os possíveis parâmetros para um construtor seguem a mesma regra que qualquer método: pode-se definir quantos parâmetros desejar, até mesmo nenhum.

A estrutura básica de um construtor é então:

NomeDaClasse(parâmetrosOpcionais){

}

Para a classe Cliente poderíamos definir um construtor que inicializa o atributo cidade com o valor "Palmas". Considerando que o exemplo proposto no Capítulo 4 é de uma loja física de móveis e eletrodomésticos, e que tal loja pode ter lojas apenas em Palmas, assumir que a maioria dos clientes moram em Palmas é uma suposição plausível. Se o cliente for de outra cidade, esta pode ser indicada no momento do cadastro. Mas queremos que o atributo cidade de todo novo cliente já seja preenchido automaticamente com "Palmas".

Para isto podemos criar um construtor dentro da classe Cliente como abaixo:

Cliente(){
    cidade = "Palmas";
}

Olhando o código do construtor acima isoladamente, pode parecer muito com a declaração de uma classe com um atributo chamado cidade. No entanto, o código da classe Cliente com o novo construtor ficaria como mostrado a seguir. Os getters e setters foram omitidos para focarmos apenas no construtor.

public class Cliente {
    private String nome;
    private String cpf;
    private String email;
    private String endereco;
    private String cidade;
    private String telefone;
    private char sexo;

    Cliente(){
        cidade = "Palmas";
    }
}

As diferenças entre a classe e o construtor são bem claras:

  • a classe é precedida pela palavra class;

  • cada atributo da classe é precedido por um tipo;

  • o construtor tem obrigatoriamente parênteses (mesmo que vazios);

  • a linha de código apresentada dentro do construtor não pode ser confundida com a declaração de um atributo pois não está sendo especificado um tipo. Esta linha claramente está atribuindo um valor à uma variável (neste caso, um atributo).

Você pode criar novos objetos clientes pelo BlueJ para verificar que todos eles terão o atributo cidade inicializado com "Palmas". Observe que quando clicamos com o botão direito sobre uma classe como a Cliente, temos a opção new Cliente() disponível. Tal opção é exatamente a chamada do construtor padrão: um que criamos ou que foi incluído automaticamente caso não tenhamos definido um.

bluej default constructor.gif

A opção new Cliente() mostra exatamente a linha de código que seria necessária para criar um cliente.

O construtor padrão é aquele que não possui nenhum parâmetro.

Permitindo definir qualquer valor inicial para um atributo

O exemplo anterior mostrou como podemos incluir um construtor padrão para definir um valor inicial para qualquer atributo. No entanto, tal valor foi definido de forma fixa: para qualquer cliente criado, automaticamente será definida a cidade como "Palmas" e não uma cidade desejada pelo usuário do sistema.

Podemos criar quantos construtores quisermos. Cada construtor permite criar novos objetos. Diferentes construtores apenas definem diferentes formas para criar os objetos. Os construtores precisam ter o mesmo nome (o nome da classe para serem um construtor), mas devem ter tipos, quantidade e/ou ordem de parâmetros diferentes.

Assim, podemos criar mais um construtor que nos permitirá definir qual a cidade no momento de criar um cliente usando tal construtor. Abaixo é apresentado apenas o código do novo construtor que precisará ser incluído dentro da classe Cliente, normalmente depois de qualquer construtor existente.

Cliente(String cidade){
    this.cidade = cidade;
}

Este outro construtor agora possui um parâmetro que nos permite indicar qual será a cidade para cada novo cliente. Observe que, assim como feito nos setters, precisamos utilizar a palavra this para diferenciar o atributo da classe do parâmetro do construtor.

O código completo dos construtores é apresentado abaixo (getters e setters omitidos intencionalmente):

public class Cliente {
    private String nome;
    private String cpf;
    private String email;
    private String endereco;
    private String cidade;
    private String telefone;
    private char sexo;

    Cliente(){
        cidade = "Palmas";
    }

    Cliente(String cidade){
        this.cidade = cidade;
    }
}

Se utilizarmos o BlueJ para criar um novo cliente, veremos que agora temos dois construtores disponíveis. Escolhendo a opção exibida na imagem abaixo, chamará o construtor que solicita a cidade do cliente. Assim, o BlueJ já exibirá um novo campo para informarmos a cidade. Em seguida, se clicarmos duas vezes no objeto criado, veremos que o atributo cidade já está preenchido com o valor informado. Podemos então criar quantos clientes desejarmos, cada um com uma cidade diferente.

bluej new constructor.gif

Em POO é muito comum definirmos diferentes construtores para uma mesma classe. Isto dá opções ao desenvolvedor no momento de criar objetos da classe. Cada construtor vai ser usado pelo desenvolvedor de acordo com as necessidades. Por exemplo, se o sistema está sendo utilizado na loja física, podemos chamar o construtor padrão (aquele sem parâmetro algum) que automaticamente define que o cliente é da cidade de "Palmas". Já se o sistema estiver sendo acessado online de fora da loja, o construtor que solicita a cidade pode ser chamado no lugar do outro, uma vez que o cliente acessando o sistema online pode estar em qualquer cidade.

Processo de criação de objetos

Já sabemos que construtores são utilizados para criar objetos. O processo de criação de objetos é denominado instanciação. Quando temos uma classe podemos instanciá-la, ou seja, criar um objeto desta classe. Um objeto é então uma instância de um classe.

Instância neste contexto signfica exemplar. Uma instância representa um exemplar de uma classe. Imagine que a descrição de um livro em um site de vendas é a classe que representa o livro e cada exemplar vendido é uma instância daquele livro.

Lembrando que mesmo que não adicionemos um construtor em uma classe, um construtor padrão será incluído automaticamente quando a classe for compilada.

Uma classe sem construtor não permite que objetos sejam criados. Isto é possível e tem suas utilidades, mas não é algo que abordaremos neste curso.

results matching ""

    No results matching ""