[OCPJP6] 006 – Declarações e controle de acesso

O modificador final em métodos e variáveis

O grande poder deste modificador é ser imutável!

métodos

Pode ser aplicado em um método com o intuito de não poder ser sobreescrito em herança.

package certificacao;

public class Calculadora {

    public final double soma(double... values) {
        double resultado = 0d;
        if (values != null) {
            for (double d : values) {
                resultado += d;
            }
        }
        return resultado;
    }
}
package certificacao;

public class CalculadoraCientifica extends Calculadora {

    // NAO COMPILA - o metodo soma nao pode ser sobrescrito
    public double soma(double... values) {
        double resultado = 0d;
        // outra regra
        return resultado;
    }
}

variáveis

Pode ser aplicado em um atributo de uma classe/método ou como um argumento de um método.

  • Como atributo de uma classe (inicialização)
package certificacao;

import java.math.BigDecimal;

public class Circulo {
    // NAO COMPILA - a variavel precisa ser inicializada
    private final BigDecimal Pi;
}
  • Como atributo de uma classe em um método (atribuição)
package certificacao;

import java.math.BigDecimal;

public class Circulo {

    private final BigDecimal Pi = new BigDecimal(3.14);

    public BigDecimal calculaArea(BigDecimal raio) {
        // NAO COMPILA - a variavel nao pode atribuir um outro valor
        Pi = new BigDecimal(3.14);
        return Pi.multiply(raio.pow(2));
    }

}
  • Como um parâmetro de um método
package certificacao;

import java.math.BigDecimal;

public class Quadrado {

    private BigDecimal lado;

    public void setLado(final BigDecimal l) {
        // NAO COMPILA - a variavel nao pode atribuir um outro valor
        l = l.multiply(BigDecimal.ONE);
        this.lado = l;
    }
}

algo engraçado

No dicionário modificador: algo que modifica!!

 – Então, que raio de modificador final é esse ?! 🙂

Comentem, estendam o assunto… Compartilhem =)

[OCPJP6] 003 – Declarações e controle de acesso

Modificadores e controles de acesso em classes

As classes em Java, são compostas por variáveis e métodos. O modo como você declara -utilizando um modificador ou controle de acesso – uma classe, um método ou uma variável afeta o comportamento do código. Vejamos abaixo isso em classes:

Os modificadores se dividem em duas categorias:

  1. Modificadores de acesso: public, protected, private.
  2. Modificadores que não se referem a acesso (incluindo strictfp, final e abstract).

Os controles de acesso (nível de acesso) são classificados em quatro e são representados por três modificadores de acesso. O quarto controle de acesso – chamado de acesso default – é o que você obtém quando não usa nenhum dos três modificadores de acesso.

Dentre os quatro controladores de acesso apenas dois podem ser usados nas declarações das classes, são eles public ou default, a não ser que seja uma inner class (classe interna) que pode usar o controlador private.

Modificadores de acesso

default

Uma classe com acesso default não tem nenhum modificador na declaração. Esse é o controle que você obtém quando não declara um modificador. As classes de nível default só podem ser acessada por classes do mesmo pacote.

Exercicio.java

package certificacao;

class Exercicio { }

Prova.java

package certificacao.prova;
import certificacao.Exercicio;

class Prova extends Exercicio { }

A classe Prova.java não irá compilar porque está em pacote diferente. Para essa classe compilar seria necessário mudar o modificador de acesso para public da classe Exercicio.java ou mover uma das classes para o mesmo pacote podendo manter o modificador default.

public

Uma classe com acesso public dá acesso a todas as classes de todos os pacotes. No entanto, não esqueça de que ao utilizar uma classe public de outro pacote, você precisará importar a classe.

Modificadores que não se referem a acesso

final

Classes com o modificador final significam que não podem ser estendidas, ou seja, nenhuma outra classe pode herdar de uma classe final. Na prática, você quase nunca criará uma classe final. As classes final acabam com um benefício fundamental da programação OO – a herança. A não ser que você tenha uma série preocupação de segurança.

Exercicio.java

package certificacao;

public final class Exercicio { }

Prova.java

package certificacao.prova;

import certificacao.Exercicio;

class Prova extends Exercicio { }

Neste caso a classe Prova.java não compilaria.

abstract

Uma classe abstract não jamais pode ser instanciada. O seu único propósito/missão, é ser estendida (herdada). Classes abstract são útilizadas para deixar as coisas genéricas, comuns a suas especializações (classes que herdam dela).

Carro.java

package certificacao.automovel;

public abstract class Carro {

    private String cor;
    private String valor;
    // getters and setters
}

Bmw.java

package certificacao.automovel;

public class Bmw extends Carro {

    private Turbo turbo;
    // getters and setters
}

Neste caso uma Bmw tem tudo que um Carro tem + turbo. Pensando em uma outra especialização de Carro, poderíamos criar um Palio com tudo que um Carro tem, mas sem o turbo da Bmw rs.

Mais pra frente irei escrever um pouco sobre polimorfismo, e como as classes abstratct são importante em questões de flexibilidade e extensibilidade.

Analisando os dois casos: Não é possível ter uma classe final e abstract ao mesmo tempo. Uma anularia a outra rs =)

Comentem, estendam o assunto… Compartilhem =)