Alterando valores dos atributos

No mundo real, clientes de uma loja têm atributos em comum, como nome, CPF e telefone. No entanto, clientes distintos têm normalmente valores diferentes para cada um destes atributos. Por exemplo, o CPF de um cliente é diferente de outro. Diferentes pessoas podem ter o mesmo nome, mas normalmente têm nomes distintos. Assim, para que possamos definir os valores de cada um destes atributos da classe, precisamos criar funções para tal finalidade. Uma função é um bloco de código que é responsável por executar uma tarefa específica, para resolver um determinado problema.

Imagine que você é diretor em uma empresa e precisa que sua secretária compre passagens áreas para você ir a uma reunião de negócios. A secretária então terá uma tarefa a ser executada: a compra das passagens. No entanto, para que ela consiga executar tal tarefa, você precisa passar algumas informações a ela, como a data que deseja viajar, cidade para onde vai e quantos dias pretende ficar em tal cidade.

De posse de tais informações, a secretária pode então comprar as passagens aéreas e retornar ao chefe informando o horário da viagem, companhia aérea e mais informações que obteve.

Adicionando funcionalidades a uma classe

A habilidade de comprar passagens que a secretária possui é então uma função. Funções preciam ter um nome. Adicionalmente elas podem: (i) solicitar dados e (ii) retornar alguma resposta a respeito do cumprimento da tarefa. Em Java, funções têm essa mesma estrutura definida em três partes:

  • nome da função;

  • parâmetros;

  • tipo de retorno.

Para o nosso objetivo de alterar os valores dos atributos de uma classe, podemos considerar a estrutura básica abaixo para criação de uma função:

TipoRetorno nomeFuncao(Tipo parametro) {

}

O TipoRetorno indica se a função precisa retornar alguma resposta para quem solicitou a execução da tarefa e que tipo de dado terá tal resposta. Tal tipo pode ser qualquer um, como String ou int. Caso a função não precise dar uma resposta (ou seja, ela tem apenas que executar uma tarefa mas não tem que responder para quem solicitou a execução de tal tarefa), a palavra void deve ser utilizada no lugar. void significa vazio, indicando que a função não retorna uma resposta.

O nome da função é definido de acordo com a finalidade da mesma. No caso do exemplo da secretária, a função poderia ser chamada de comprarPassagensAereas. Se a função necessitar que sejam passados quaisquer dados para que ela possa executar sua tarefa, tais dados precisam ser indicados dentro dos parênteses. Estes dados são denominados parâmetros e são opcionais. O exemplo mostra a estrutura de uma função com 1 parâmetro.

Os parâmetros também são variáveis. Assim como os atributos, eles são chamados por um nome diferente pois funcionam de forma diferente, como será visto adiante.

Nomes de funções seguem o mesmo padrão de nomes de atributos: iniciam com minúsculas, intercalando maiúscula para cada palavra. Evite usar acentos.

Funções em Java devem ser incluídas obrigatoriamente dentro de uma classe. Uma função, da forma como utilizada em POO com Java, não pode ser incluída dentro das chaves de outra função. Para quem está iniciando na criação de funções, a forma mais simples de incluir uma nova função é antes do fecha-chaves da classe (normalmente o último } encontrado).

Para podermos criar a nossa primeira função que permita alterar um atributo como o endereco, precisamos então definir qual o tipo de retorno, o nome da função e seus parâmetros. No caso de funções que alteram atributos, normalmente elas não dão nenhuma resposta, o que dizemos que elas não retornam nenhum valor. Ou seja, o tipo de retorno é void.

Poderíamos chamar a função de alteraEndereco, mas para funções que alteram atributos, há uma convenção importantíssima de utilizar o formato setNomeDoAtributo (set significa neste contexto alterar ou atribuir). No caso do atributo endereco, a função deve ser chamada setEndereco. Tais funções devem ter apenas um parâmetro, que indica qual é o dado que será armazenado no atributo quando a função for executada. Como os parâmetros são nada mais que variáveis, precisamos definir o tipo e nome de cada um. No caso das funções em questão, o tipo e nome podem ser exatamente os mesmos do atributo que será alterado pela função. Assim, nossa função para alterar o endereço de um cliente terá a seguinte estrutura:

void setEndereco(String endereco) {

}

A função precisará receber um endereço como parâmetro e armazenar tal endereço no atributo endereco, alterando assim o endereço do cliente. Para isso, ela só precisa de uma única linha de código, como mostrado abaixo:

void setEndereco(String endereco) {
    this.endereco = endereco;
}

A linha this.endereco = endereco; copia o endereço recebido no parâmetro endereco e armazena no atributo endereco da classe. Como o parâmetro e o atributo têm o mesmo nome, utilizamos this.endereco para nos referirmos ao atributo e apenas endereco para nos referirmos ao parâmetro recebido pela função. A palavra this significa "este" e representa o objeto para o qual o endereço estiver sendo alterado.

Nestes casos, se utilizarmos apenas a instrução endereco = endereco, não teremos o resultado esperado: obter o valor do parâmetro e armazenar no atributo. Na verdade, tal instrução não terá efeito algum, uma vez que estamos atribuindo o valor de uma variável a ela mesma: ou seja, o valor do parâmetro endereco a ele mesmo.

Como alteramos a classe cliente, vamos compilar novamente e criar um novo objeto chamado cliente1, seguindo os mesmos passos indicados anteriormente. Clique com o botão direito sobre o cliente1 criado na parte inferior do BlueJ. Você verá que a função setEndereco agora aparece na lista de opções. Desta forma, podemos executar a função, o que em programação dizemos chamar a função.

bluej method call.gif

O BlueJ indentifica que a função requer um parâmetro e solicita que digitemos um valor. Como o endereço é String, o valor precisa ser digitado entre "aspas duplas", como exemplificado na figura acima.

Após pressionarmos OK, podemos dar dois cliques no cliente1 e veremos que o atributo endereco do cliente1 foi alterado para o valor que informamos para a função setEndereco.

bluej object changed.gif

Quando clicamos no cliente1 para alterar o endereço, this representa o objeto cliente1. Assim, this.endereco representa o atributo endereço do cliente1, enquanto somente endereco representa o parâmetro que possui o mesmo nome do atributo.

A animação abaixo mostra o que acontece quando a função setEndereco é chamada, além da relação entre o parâmetro e o atributo endereco.

attributes and method parameters.gif
Figure 1. Como o atributo endereco da classe Cliente funciona em conjunto com o parâmetro endereco da função setEndereco.

Primeiramente, quando a função setEndereco é executada, ela receberá um endereço no parâmetro endereco. A função então armazena tal endereço no atributo endereco do objeto atual.

Setters: mais um conceito de POO

Toda função que altera o valor de um atributo é chamada de setter. Ela é uma função como qualquer outra, mas tem essa finalidade específica. Qualquer atributo que precise ter seu valor alterado necessita de um setter.

results matching ""

    No results matching ""