3
respostas

Aplique princípios de encapsulamento a uma classe - Exercício 5

O código em questão está logo abaixo se precisar.

  • No código tenho duas classes compiladas juntas!!!??? Sempre faço classes separadas, como é isso? Se eu separá-las, ou seja, salvar B numa classe e A em outra classe separada, dá erro
  • Na classe B tenho um método B, com o mesmo nome da classe certo? Eu comentei o get e o set do B e fui criar de novo via Eclipse mas ele cria só o get, sabe me dizer o por que?

  • Comentando o que o código faz:

    • Na Classe A no void é criado um new b passando um int 10 como parametro,
      • Depois é usado o set passando um int 5.
      • E no fim usou-se o get que trouxe o valor 10 por que a classe b foi criada com um int 10 como parametro. Estes passos estão corretos?

Existem perguntas e comentários nestes tópicos, poderiam me esclarecer as dúvidas por favor.

Outra coisa: em alguns casos vocês criam classes assim: class A B {} como é esta sintaxe?

Obrigado!

class B { private final int b;

B(int b) { this.b = b; } public int getB() { return b; }

public void setB(int b) { b = b; }}

class A { public static void main(String[] args) { B b = new B(10); b.setB(5); System.out.println(b.getB()); } }

3 respostas

Oi Adauto, fiquei meio confuso por conta da falta de formatação do código, será que você pode postar de novo os códigos?

Olhando apenas o que você postou o único que eu percebo é que no método setB você não usa o this para atualizar o valor do atributo.

Oi Alberto, é claro, foi mal!!!

class B {
    private final int b;

    B(int b) { 
        this.b = b;
    }
    public int getB() { 
        return b; 
    }

    public void setB(int b) { 
        b = b; 
    }    
}

class A {
    public static void main(String[] args) {
        B b = new B(10);
        b.setB(5);
        System.out.println(b.getB());
    }
}

Oi Adauto, espero conseguir responder suas perguntas... vamos lá!

1-" No código tenho duas classes compiladas juntas [...].

É possível ter duas classes dentro de um mesmo arquivo sim! A lógica é: quando você tem um arquivo (A.java) e possui dentro dele duas declarações de classe:class A e class B, sem serem públicas. O compilador irá gerar as classes sem problema algum.

O único problema que pode acontecer é a classe pública ser diferente do nome do arquivo ou então conter duas classes públicas dentro do mesmo arquivo. O resto é tudo livre!

2-"Na classe B tenho um método B, com o mesmo nome da classe certo? Eu comentei o get e o set do B e fui criar de novo via Eclipse mas ele cria só o get, sabe me dizer o por que?

Há uma diferença dos valores existentes dentro da classe, veja:

class B {
    // atributo inteiro com nome b (atente-se ao minúsculo)
    private final int b;

    // construtor da classe B, sem modificador de acesso 
    //(modificador padrão default)
    B(int b) { 
        this.b = b;
    }

    // getter para o atributo b
    public int getB() { 
        return b; 
    }

    // setter para o atributo b
    public void setB(int b) { 
        // cuidado com os parâmetros
        b = b; 
    }    
}

Na marcação de cuidado com os parâmetros está acontecendo o seguinte: o parâmetro b está recebendo o valor dele mesmo (b = b).

Isso acontece por conta do escopo de seu método. Quando temos um atributo b dentro da classe, podemos acessá-lo em um método dentro da mesma a partir de seu nome ou com o operador this. Este operador se torna opcional quando não temos nenhuma variável ou parâmetro dentro do escopo que interfira com o atributo.

A partir do momento em que temos um parâmetro (ou variável) chamada b dentro do método, o compilador entenderá que ela deverá ser tratada com prioridade, fazendo com que o atributo fique ''escondido''. Nesses casos de variáveis e parâmetros juntos, é necessária a utilização do this para sua invocação.

Isso nós chamamos de shadowing, dá uma olhada neste post feito pelo Alex lá no blog.

3- Comentando o que o código faz [...]

Agora, tratando sobre o método main dentro da classe A:

class A {
    public static void main(String[] args) {
        // cria instância de B (classe) e com b (atributo) valendo 10
        B b = new B(10);
        // define o valor de b (atributo) para 5
        b.setB(5);
        // imprime 5
        System.out.println(b.getB());
    }
}

NOTA: Eu só tive certeza em dizer que seria para o atributo b por olhar a implementação do setter e getter definidos na classe B, mas tome cuidado com isso, pois depende da implementação.

Tenha cuidado também com as nomenclaturas, declarações e escopos de métodos, pois é isso que está causando o problema.

Espero ter ajudado.