Será que está OO?

11 respostas
G

Olá a todos!

Fiz aqui alguns exercícios da Apostila fj11, e o exercicio diz:

quote Adicione um atributo na classe Funcionario de tipo int que se chama identi?cador. Esse
identi?cador deve ter um valor único para cada instância do tipo Funcionario. O primeiro Funcionario
Capítulo ä - Modi?cadores de acesso e atributos de classe - Exercícios: Encapsulamento, construtores e static - Página �ó
Material do Treinamento Java e Orientação a Objetos
instanciado tem identi?cador Õ, o segundo ó, e assim por diante. Você deve utilizar os recursos aprendidos
aqui para resolver esse problema.
Crie um getter para o identi?cador. Devemos ter um setter?[/quote]

Ai consegui apos ter pensado um pouco, utilizando setter , e ficou assim;

void adiciona(Funcionario f){ this.empregados[contador] = f; this.empregados[contador].setIdentificador(contador); contador ++; }

Sendo assim, quando eu crio um Funcionário, eu aproveito o contador e utilizo já o identificador da classe Funcionario.

Agora vem a pergunta, está seguido nas normas , ou eu teria que fazer de outro jeito? , relembrando que este modo está correto , dando erro nenhum!.

11 Respostas

Rodrigo_Sasaki

esse seu quote ficou bem estranho hein, não entendi nada.

mas parece correto, se o contador não for static parece correto.

Algo que provavelmente não vai mudar nada, mas que é interessante saber, é que você poderia ter incrementado o contador na linha 03, não haveria diferença.

G

obrigado.

eu dei control +c e control + v ai saio assim kkk ,nem vi aushaush

sim o contador nao é static ele é int e só.

D

acho que tá errado em,pois no caso do contador não for estático o valor dele sempre será 0

al.barbosa

Guilherme

Dei uma olhada na fj11, acho que o exercício é esse aqui:

quote Adicione um atributo na classe Funcionario de tipo int que se chama identificador. Esse identificador deve ter um valor único para cada instância do tipo Funcionario. O primeiro Funcionario instanciado tem identificador 1, o segundo 2, e assim por diante. Você deve utilizar os recursos aprendidos aqui para resolver esse problema.
Crie um getter para o identificador. Devemos ter um setter?[/quote]

Que está na seção Exercícios: Encapsulamento, construtores e static

Não vi necessidade de criar um vetor de funcionários. Nestes exercícios ele apenas cria a classe Funcionario, conforme abaixo (este código está na questão 2):

class Funcionario { private double salario; // ... public double getSalario() { return this.salario; } public void setSalario(double salario) { this.salario = salario; } }

Ele está pedindo: “Adicione um atributo na classe Funcionario de tipo int que se chama identificador”, então você pode adicionar o seguinte dentro da classe:

private int identificador;

A questão é que “O primeiro Funcionario instanciado tem identificador 1, o segundo 2, e assim por diante”. Como fazer o identificador ser 1 para o primeiro Funcionario, e ser incrementado em 1 para cada funcionario criado? Você precisa de um contador que seja incrementado a cada funcionário criado. E precisa guardar esse contador em algum lugar que todo funcionário possa acessar. O contador deve pertencer à classe Funcionario, e não a cada objeto da classe. Qual o tipo de atributo que é da classe, e não do objeto? É o atributo do tipo static.
Então você pode incluir o seguinte atributo:

private static int contadorFuncionario;

E no construtor da classe funcionario colocar o seguinte:

public Funcionario(){ identificador = ++contadorFuncionario; }

Assim o contadorFuncionario será incrementado a cada funcionário criado. O identificador do funcionário criado recebe o valor do contador no momento da criação do funcionário.

Ele pede: “Crie um getter para o identificador”. Então pode incluir:

public int getIdentificador(){ return identificador; }

Qual a resposta para a outra pergunta: “Devemos ter um setter?”

G

al.barbosa:
Guilherme

Dei uma olhada na fj11, acho que o exercício é esse aqui:

quote Adicione um atributo na classe Funcionario de tipo int que se chama identificador. Esse identificador deve ter um valor único para cada instância do tipo Funcionario. O primeiro Funcionario instanciado tem identificador 1, o segundo 2, e assim por diante. Você deve utilizar os recursos aprendidos aqui para resolver esse problema.
Crie um getter para o identificador. Devemos ter um setter?

Que está na seção Exercícios: Encapsulamento, construtores e static

Não vi necessidade de criar um vetor de funcionários. Nestes exercícios ele apenas cria a classe Funcionario, conforme abaixo (este código está na questão 2):

class Funcionario { private double salario; // ... public double getSalario() { return this.salario; } public void setSalario(double salario) { this.salario = salario; } }

Ele está pedindo: “Adicione um atributo na classe Funcionario de tipo int que se chama identificador”, então você pode adicionar o seguinte dentro da classe:

private int identificador;

A questão é que “O primeiro Funcionario instanciado tem identificador 1, o segundo 2, e assim por diante”. Como fazer o identificador ser 1 para o primeiro Funcionario, e ser incrementado em 1 para cada funcionario criado? Você precisa de um contador que seja incrementado a cada funcionário criado. E precisa guardar esse contador em algum lugar que todo funcionário possa acessar. O contador deve pertencer à classe Funcionario, e não a cada objeto da classe. Qual o tipo de atributo que é da classe, e não do objeto? É o atributo do tipo static.
Então você pode incluir o seguinte atributo:

private static int contadorFuncionario;

E no construtor da classe funcionario colocar o seguinte:

public Funcionario(){ identificador = ++contadorFuncionario; }

Assim o contadorFuncionario será incrementado a cada funcionário criado. O identificador do funcionário criado recebe o valor do contador no momento da criação do funcionário.

Ele pede: “Crie um getter para o identificador”. Então pode incluir:

public int getIdentificador(){ return identificador; }

Qual a resposta para a outra pergunta: “Devemos ter um setter?”

[/quote]

Desculpe a demora para responder , estou viajando e só agora tive acesso a internet…
Conforme você escreveu… acho melhor pensar um pouco.

Não acha mais viavel, quando eu criar um Funcionario ele já dá um identificador pra ele ?
Pense bem, eu crio um metodo a mais para só identifica-lo, não me parece nada confortante.
O certo seria criou um funcionario? já dê logo um identificador pra ele, não invente metodos, para fazer isto! ( no caso que você fez foi um construtor)

Sendo assim al.barbosa , está de acordo? , não acha mais viavel o método que fiz?

void adiciona(Funcionario f){ this.empregados[contador] = f; this.empregados[contador].setIdentificador(contador); contador ++; }

Sobre o exercício, eu fiz tudo sem problemas, e esta igual ao meu =)

Ah! e sobre o …

claro que não. pra que mudar o identificador do Funcionario, sendo que o identificador serve pra identifica-lo!,NÃO devemos NEM, queremos mecher nele.

Até + , qualquer coisa só postar ai , que agente discute =)

wagnerfrancisco

O método adiciona está em que classe Guilherme?

Sem um contexto é difícil avaliar. Mas sugiro que você pense no seguinte:

Se você criar um objeto Funcionario e não chamar o método adicionar, você terá problemas? Será que a identidade deste objeto deve depender do objeto que contém o método adiciona?
Faz sentido o contador de Funcionario estar nesta classe que contém o método adiciona?

G

wagnerfrancisco:
O método adiciona está em que classe Guilherme?

Sem um contexto é difícil avaliar. Mas sugiro que você pense no seguinte:

Se você criar um objeto Funcionario e não chamar o método adicionar, você terá problemas? Será que a identidade deste objeto deve depender do objeto que contém o método adiciona?
Faz sentido o contador de Funcionario estar nesta classe que contém o método adiciona?


Bem, se pensarmos um pouco, para identificar o funcionario precisamos de uma referencia certo?, porque ,o sentido deste programa é criar um funcionario…Claro!, apos fazer a inicialização do mesmo.
Bem olha como estava meu adiciona antes de implementar o Identificador

void adiciona(Funcionario f){ this.empregados[contador] = f; contador ++; }
só que agora pensemos, o contador está na classe do Funcionario, para fazer essa contagem para a array.
mas, porque eu iria fazer um outro metodo pra identificar um funcionario?, semantica? OO? bem isto não sei te explicar porque estou aprendendo agora, mas quem souber da um apoio ai =)
Ai, oque eu fiz, aproveitei o contador da array, para implementar esta pequena linha .

this.empregados[contador].setIdentificador(contador);

ai quando juntei ficou assim:

void adiciona(Funcionario f){ this.empregados[contador] = f; this.empregados[contador].setIdentificador(contador); contador ++; }

OBS: O contador , ele esta na classe Funcionario.
OBS²: Método adiciona está na classe Empresa

Ai veio uma questao, crio um metodo separado para ese identificador? ou utilizo do jeito que esta( dentro do adiciona)? =)

G

concordo com o q vc falou.
mas isso é o q al.barbosa fez e exatamente o contrario do q vc fez.

veja:

reposta sua:

olha seu código:

void adiciona(Funcionario f){ this.empregados[contador] = f; this.empregados[contador].setIdentificador(contador); /////ISSO NÃO É UM seter? contador ++; }

al.barbosa
Não acha mais viavel, quando eu criar um Funcionario ele já dá um identificador pra ele ? Pense bem, eu crio um metodo a mais para só identifica-lo, não me parece nada confortante. O certo seria criou um funcionario? já dê logo um identificador pra ele, não invente metodos, para fazer isto! ( no caso que você fez foi um construtor)

Guilherme, concordo. Acho mais viável quando criar um Funcionario já dar um identificador para ele.

Bom, você está dando o identificador no método adiciona(), que está na classe Empresa.

Será que o seu Funcionario não pode ser usado fora da classe Empresa?

Da forma que você está fazendo, a classe Empresa é quem está dando o identificador para o Funcionario. Se o Funcionario for usado fora da classe Empresa, ele ficará sem identificaodr.

E além disso, dessa forma o Funcionario precisa de um método setIdentificador() para receber o identificador. Você mesmo concordou que não devemos ter um setter, e o setIdentificador() é nada mais que um setter.

O que estou tentando fazer é que a própria classe Funcionario crie o seu identificador. Assim, eu posso usar o Funcionario em qualquer lugar, mesmo que não seja na classe Empresa.

Bom, acho que não estou "inventando métodos". Estou atribuindo o identificador no construtor porque é o método que será chamado toda vez que eu criar um Funcionario. É a única forma de eu atribuir o identificador para qualquer funcionário. Se eu não atribuir o identificador no construtor, eu poderei criar um Funcionario sem identificador. Mesmo que eu crie outro método para atribuir o identificador, se esse método não for chamado, um Funcionario poderá ser criado sem identificador.

Então atribuir o identificador no construtor garante que todo Funcionario terá um identificador.

Agora, a questão é a seguinte: como um novo Funcionario vai saber o seu identificador? Ele precisa saber o maior identificador de todos os funcionários e somar um, não é? Então é preciso ter um contador de funcionários em algum lugar. Não pode ser em outra classe (como Empresa) porque assim você vai sempre precisar da outra classe e não garante que todo funcionário terá um identificador.

A solução é usar o atributo do tipo static. O contadorFuncionario é do tipo static. Isso significa que qualquer objeto da classe Funcionario vai ver o mesmo contadorFuncionario. Assim, posso usar esse atributo em todo objeto da classe Funcionario para saber o total de funcionários.

Este exercício está justamente na seção Encapsulamento, construtores e static. Acho que o objetivo é exercitar estes conceitos: Encapsulamento - quando você precisa de getter/setter? Construtores - Por que a atribuição do identificador deve estar no construtor? E static.

Abaixo o código para a classe Funcionario que fiz. Observe que a própria classe Funcionario controla a atribuição do identificador (você pode executar pois tem um método main).

public class Funcionario {
   private double salario;
   private int identificador;
   private static int contadorFuncionario;

   public Funcionario(){
      identificador = ++contadorFuncionario;
   }

   public int getIdentificador(){
      return identificador;
   }

   public double getSalario() {
      return this.salario;
   }
   
   public void setSalario(double salario) {
      this.salario = salario;
   }

   public static void main(String args[]){
      Funcionario f = new Funcionario();
      f.setSalario(1000);
      System.out.println("Salario de f: " + f.getSalario());
      System.out.println("Identificador de f: " + f.getIdentificador());
      Funcionario f2 = new Funcionario();
      System.out.println("Identificador de f2: " + f2.getIdentificador());
      Funcionario f3 = new Funcionario();
      System.out.println("Identificador de f3: " + f3.getIdentificador());
   }
}
G

GilsonNunes:
Guilherme.Escarabel:

Não acha mais viavel, quando eu criar um Funcionario ele já dá um identificador pra ele ?
Pense bem, eu crio um metodo a mais para só identifica-lo, não me parece nada confortante.
O certo seria criou um funcionario? já dê logo um identificador pra ele, não invente metodos, para fazer isto! ( no caso que você fez foi um construtor)

concordo com o q vc falou.
mas isso é o q al.barbosa fez e exatamente o contrario do q vc fez.

veja:

reposta sua:

olha seu código:

void adiciona(Funcionario f){ this.empregados[contador] = f; this.empregados[contador].setIdentificador(contador); /////ISSO NÃO É UM seter? contador ++; }

kkk. eu tbm ri =)

mas eu fiz isto para demonstrar como eu tinha feito, e eu falei se era necessario, eu logo coloquei minha opinião sendo a de que nao precisariamos, por isso estou aqui , para tentar ver modos de nao utiliza-lo =)

al.barbosa

quando eu disse não invente metodos , nao foi com arrogancia e sim como uma colocação de: não seria necessario implementar mais um metodo e sim usar o existente.

Agora no final acabei concordando com você, assim ficara um pouco mais encapsulado. até no futuro mais façil de arrumar/ implementar mais cenarios =)

obrigado @all

al.barbosa

al.barbosa

quando eu disse não invente metodos , nao foi com arrogancia e sim como uma colocação de: não seria necessario implementar mais um metodo e sim usar o existente.

Ok, não achei que você falou com arrogância. Eu também acho que não se deve criar um método se isso não for necessário. Só quiz dizer que não é esse o caso no exemplo, que não estou criando um método desnecessário ao usar o construtor para atribuir o identificador.

Bons estudos!

Criado 20 de julho de 2012
Ultima resposta 26 de jul. de 2012
Respostas 11
Participantes 6