• Nenhum resultado encontrado

Métodos Estáticos

No documento Orientação a Objetos em Java (páginas 84-91)

Definimos métodos para implementar as lógicas que manipulam os valores dos atributos de ins- tância. Podemos fazer o mesmo para os atributos de classe.

Suponha que o banco tenha um procedimento para reajustar o valor do vale refeição baseado em uma taxa. Poderíamos definir um método na classeFuncionariopara implementar esse reajuste.

1 void reajustaValeRefeicaoDiario (double taxa ) {

3 }

Código Java 5.6: Método que reajusta o valor do vale refeição

O método reajustaValeRefeicaoDiario() é de instância. Consequentemente, ele deve ser chamado a partir da referência de um objeto da classeFuncionario.

Contudo, como o reajuste do valor do vale refeição não depende dos dados de um funcionário em particular, não faz sentido precisar de uma referência de um objeto da classeFuncionariopara poder fazer esse reajuste.

Neste caso, poderíamos definir oreajustaValeRefeicaoDiario()como método de classe ao invés de método de instância. Aplicando o modificadorstaticnesse método, ele se tornará um método de classe. Dessa forma, o reajuste poderia ser executado independentemente da existência de objetos da classeFuncionario.

1 static void reajustaValeRefeicaoDiario (double taxa ) {

2 Funcionario . valeRefeicaoDiario += Funcionario . valeRefeicaoDiario * taxa ; 3 }

Código Java 5.7: Método que reajusta o valor do vale refeição

Um método de classe deve ser chamado através do nome da classe na qual ele foi definido. 1 Funcionario . reajustaValeRefeicaoDiario (0.1) ;

Código Java 5.8: Chamando um método de classe

Podemos chamar um método de classe através de uma referência de um objeto da classe na qual o método foi definido. Contudo, não seria a maneira conceitualmente correta já que o método pertence a classe e não ao objeto.

1 Funcionario f = new Funcionario () ; 2 // Válido , mas conceitualmente incorreto

3 f . reajustaValeRefeicaoDiario (0.1) ;

Código Java 5.9: Chamando um método de classe

Exercícios de Fixação

1 Para não confundir, feche o projetoArrays clicando com o botão direito do mouse sobre esse projeto e selecionando a opção “Close Project”. Em seguida, crie um novo projeto para os exercícios desse capítulo. Digite “CTRL + 3” e pesquise por “Create a Java project”. Selecione a opção corres- pondente e siga a imagem abaixo.

2 Crie uma classe chamadaConta no projeto Static. Defina um atributo para contabilizar o nú-

mero de objetos instanciados a partir da classeConta. Esse atributo deve ser incrementado toda vez que um objeto é criado. Utilize um construtor para fazer esse incremento.

1 public class Conta { 2 int contador ; 3 4 Conta () { 5 this. contador ++; 6 } 7 }

Código Java 5.10: Conta.java

3 Faça um teste criando dois objetos da classeConta. Exiba o valor do atributo contador depois da criação de cada objeto. Crie uma classe chamadaTestaContador com o seguinte conteúdo.

2 public static void main ( String [] args ) { 3 Conta c1 = new Conta () ;

4

5 System . out . println (" Contador : " + c1 . contador ) ; 6

7 Conta c2 = new Conta () ; 8

9 System . out . println (" Contador : " + c2 . contador ) ; 10 }

11 }

Código Java 5.11: TestaContador.java

Execute a classeTestaContadore observe que o valor 1 é exibido duas vezes.

4 Altere a classeConta. O atributocontador deve ser um atributo de classe. Então, adicione o modificadorstatic nesse atributo. Além disso, no construtor, acesse o atributocontadorcom o nome da classe e não com a variávelthis.

1 public class Conta { 2 static int contador ; 3

4 Conta () {

5 Conta . contador ++;

6 }

7 }

Código Java 5.12: Conta.java

5 Altere a classeTestaContador. Acesse o atributo contador através do nome da classe e não através das variáveis locais que armazenam referências de objetos do tipoConta. Além disso, exiba o valor do atributocontadorantes dos objetos da classeContaserem criados.

1 public class TestaContador {

2 public static void main ( String [] args ) {

3 System . out . println (" Contador : " + Conta . contador ) ; 4

5 Conta c1 = new Conta () ; 6

7 System . out . println (" Contador : " + Conta . contador ) ; 8

9 Conta c2 = new Conta () ; 10

11 System . out . println (" Contador : " + Conta . contador ) ; 12 }

13 }

Código Java 5.13: TestaContador.java

Execute a classeTestaContadore observe que o valor do contador está correto.

6 O contador de contas pode ser utilizado para gerar um número único para cada conta. Acres-

cente na classeContaum atributo de instância para guardar os números das contas. Implemente no construtor a lógica para gerar esses números de forma única através do contador de contas.

1 public class Conta { 2 static int contador ; 3

4 int numero ; 5

6 Conta () {

7 Conta . contador ++;

8 this. numero = Conta . contador ;

9 }

10 }

Código Java 5.14: Conta.java

7 Altere a classeTestaContador. Exiba no Console os números das contas. 1 public class TestaContador {

2 public static void main ( String [] args ) {

3 System . out . println (" Contador : " + Conta . contador ) ; 4

5 Conta c1 = new Conta () ;

6 System . out . println (" Numero da primeira conta : " + c1 . numero ) ; 7

8 System . out . println (" Contador : " + Conta . contador ) ; 9

10 Conta c2 = new Conta () ;

11 System . out . println (" Numero da segunda conta : " + c2 . numero ) ; 12

13 System . out . println (" Contador : " + Conta . contador ) ; 14 }

15 }

Código Java 5.15: TestaContador.java

Execute a classeTestaContador.

8 Adicione um método de classe na classeContapara zerar o contador e exibir o total de contas anterior.

1 static void zeraContador () {

2 System . out . println (" Valor atual do contador : " + Conta . contador ) ; 3 System . out . println (" Zerando o contador de contas ... ") ;

4 Conta . contador = 0; 5 }

Código Java 5.16: Método zeraContador()

9 Altere a classeTestaContador. Utilize o métodozeraContador(). 1 public class TestaContador {

2 public static void main ( String [] args ) {

3 System . out . println (" Contador : " + Conta . contador ) ; 4

5 Conta c1 = new Conta () ;

6 System . out . println (" Numero da primeira conta : " + c1 . numero ) ; 7

8 System . out . println (" Contador : " + Conta . contador ) ; 9

10 Conta c2 = new Conta () ;

11 System . out . println (" Numero da segunda conta : " + c2 . numero ) ; 12

13 System . out . println (" Contador : " + Conta . contador ) ; 14

16 } 17 }

Código Java 5.17: TestaContador.java

Execute a classeTestaContador.

Exercícios Complementares

1 Crie uma classe chamadaFuncionario para modelar os funcionários do banco. Considere que

esses funcionários possuem nome e salário. Defina nessa classe um atributo para armazenar o valor do vale refeição diário pago aos funcionários. Considere que esse valor é igual para todos os funcio- nários.

2 Faça um teste para verificar o funcionamento do atributo que armazena o valor do vale refei- ção dos funcionários. Altere e exiba no Console o valor desse atributo. Crie uma classe chamada TestaValeRefeicao.

3 Defina um método de classe na classeFuncionariopara reajustar o vale refeição diário a partir de uma taxa.

ENCAPSULAMENTO

C

A P Í T U L O

6

Atributos Privados

No sistema do banco, cada objeto da classeFuncionariopossui um atributo para guardar o sa- lário do funcionário que ele representa.

1 class Funcionario { 2 double salario ; 3 }

Código Java 6.1: Funcionario.java

O atributosalariopode ser acessado ou modificado por código escrito em qualquer classe que esteja no mesmo diretório que a classeFuncionario. Portanto, o controle desse atributo é descen- tralizado.

Para identificar algum erro relacionado a manipulação dos salários dos funcionários, é necessá- rio verificar o código de todos os arquivos da pasta onde a classeFuncionarioestá definida. Quanto maior o número de arquivos, menos eficiente será a manutenção da aplicação.

Podemos obter um controle centralizado tornando o atributosalarioprivado e definindo mé- todos para implementar todas as lógicas que utilizam ou modificam o valor desse atributo.

1 class Funcionario { 2 private double salario ; 3

4 void aumentaSalario (double aumento ) { 5 // lógica para aumentar o salário

6 }

7 }

Código Java 6.2: Funcionario.java

Um atributo privado só pode ser acessado ou alterado por código escrito dentro da classe na qual ele foi definido. Se algum código fora da classeFuncionariotentar acessar ou alterar o valor do atributo privadosalario, um erro de compilação será gerado.

Definir todos os atributos como privado e métodos para implementar as lógicas de acesso e alte- ração é quase uma regra da orientação a objetos. O intuito é ter sempre um controle centralizado do dados dos objetos para facilitar a manutenção do sistema e a detecção de erros.

No documento Orientação a Objetos em Java (páginas 84-91)