Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Dúvida no Ex. 1 da Aula 6 - Construtores

Olá, eu tenho uma dúvida que na verdade se estende desde o exercício 4 da aula 5. Quando eu coloquei o atributo "funcionarios" dentro da classe Empresa para privado eu tive um certo problema em criar estes funcionários na main. Eu não podia fazer desta forma:

nomedaempresa.funcionarios = new Funcionarios2[10];

Então eu dei uma pesquisada no forum e descobri que eu podia fazer o seguinte:

        Funcionarios2[] f2;
        f2 = new Funcionarios2[10];
        dupont.setNovosFuncionarios(f2);

Só que eu percebi que apesar do atributo funcionários estar privado na classe Empresa eu posso altera-lo através da variável f2 que é uma classe Funcionarios2. Continuando, eu criei o construtor desta forma:

public Funcionarios2(String nome){
        setNome(nome);
    }

Só que como eu criei um método para criar os novos funcionários, através do método citado acima, eu não sei como fazer para declarar seus nomes deles já que é uma array. Desculpa se não fui muito claro e qualquer coisa eu presto esclarecimentos.

Restante do código está assim:

class Empresa2{
    String nome;
    int cnpj;
    int contador = 0;
    private Funcionarios2[] funcionarios;

    public void setNovosFuncionarios(Funcionarios2[] f){
        this.funcionarios = f;
    }

    public Funcionarios2 getFuncionario(int posicao){
        return this.funcionarios[posicao];
    }    

    void adiciona(Funcionarios2 f){
        this.funcionarios[this.contador] = f;
        contador ++;
    }






    void mostraTodasInformacoes(){
        for(int i = 0 ; i<this.funcionarios.length; i++){
            if(getFuncionario(i)==null) continue;
            System.out.print("o funcinario " + i + " ganha " + this.funcionarios[i].getSalario());
            if(getFuncionario(i).getRg() == 0){
                System.out.print(" Rg nao cadastrado ");
            } else{
                System.out.print("o RG do funcinario " + i + " é " + this.funcionarios[i].getRg());
                }
            if(getFuncionario(i).getNome() == null){
                System.out.print(" nome nao cadastrado ");
            } else{ 
                System.out.println("o nome do funcionario " + i + " é " + this.funcionarios[i].getNome());
                }
            System.out.println(" ");
        }
    }



}



class Funcionarios2{
    private String nome;
    private int rg;
    private double salario;

    public Funcionarios2(String nome){
        setNome(nome);
    }

    public Funcionarios2(){
        }

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

    public void setNome(String nome){
        this.nome = nome;
    }

    public void setRg(int RG){
        this.rg = RG;
    }

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

    public int getRg(){
        return this.rg;
    }

    public String getNome(){
        return this.nome;
    }


}


class Programa2{
    public static void main(String[] args){
        Empresa2 dupont = new Empresa2();
        Funcionarios2[] f2;
        f2 = new Funcionarios2[10];
        dupont.setNovosFuncionarios(f2);


    for (int i = 0; i < 6; i++) {
        Funcionarios2 f = new Funcionarios2();
        f.setSalario(1000 + i * 100);
        dupont.adiciona(f);
   }


    f2[1].setSalario(3000);


    dupont.mostraTodasInformacoes();




    }    
}
5 respostas

Ola Lucas,

Se entendi o seu problema direito voce deseja criar uma lista de 'Funcionarios', para fazer isso voce precisa criar os funcionarios antes, por exemplo:

Funcionarios2 f1 = new Funcionarios2("Shibao");
Funcionarios2 f2 = new Funcionarios2("Lucas");
Funcionarios2 f3 = new Funcionarios2("Thiago");
Funcionarios2 f4 = new Funcionarios2("Bianca");

Para criar uma lista de funcionarios voce pode fazer assim:

Funcionarios[] funcionarios = {f1, f2, f3, f4} ;

Agora para usar no seu exemplo é facil:

Empresa2 dupont = new Empresa2();
Funcionarios2 f1 = new Funcionarios2("Shibao");
Funcionarios2 f2 = new Funcionarios2("Lucas");
Funcionarios2 f3 = new Funcionarios2("Thiago");
Funcionarios2 f4 = new Funcionarios2("Bianca");
Funcionarios[] funcionarios = {f1, f2, f3, f4} ;
dupont.setNovosFuncionarios(funcionarios);

Espero ter ajudado!

Em parte resolveu minha dúvida mas tipo, como f1,f2 ...f4 são objetos o que eu estou fazendo é apenas apontar que o atributo "funcionários" apontem para esses objetos e de nada adianta eu settar ele pra privado, porque eu continuo tendo acesso aos objetos f1,f2...f4 e posso modifica-los. Tem como resolver isso? Então não seria possível eu criar um construtor que me pedisse para settar todos os nomes do funcionários de uma array de uma vez só? Outra dúvida menos importante é como eu faço para quebrar linhas no forúm.

solução!

O fato do atributo estar privato impede com que o atributo seja modificado diretamente, ou seja, so consigo editar os funcionarios pelos metodos:

setNovosFuncionarios() ou adiciona()

Neles voce pode colocar qualquer logica de validadacao. Por exemplo para o metodo adiciona:

public boolean adiciona(Funcionarios2 f){
    if(f.getNome() == null){
        return false;
    } else {
        this.funcionarios[this.contador] = f;
        contador ++;
    }
    return true;
}

Repare que troquei o metodo de void para boolean assim quem chamar o metodo ira saber se o funcionario foi adicionado ou nao.

Para quebrar linhas aqui no forum, basta dar dois enters .

Sugestão ao escrever o código:

Nas classes você está referenciando a 1 funcionário ou mais de 1? Como só tem o atributo somente a 1 único funcionário não deve colocar nome como Funcionarios.

CPF ou CNPJ se colocar como int vai ficar errado quando escrever o CPF ou CNPJ com inicio 000..., a melhor solução é ser String, se pensar em salvar estes valores no Banco de Dados eles salvarão por completo.

Nomes de variáveis deixe o mais próximo do real para melhor entendimento, evite tipo:

  Funcionario[] f2;

Colocando

  Funcionario[] funcionario;

A leitura fica bem mais prática, tanto no desenvolvimento ou outras pessoas que for ler o seu código.

Voltando ao código seu: Primeiro você tem que saber que tem a partir da empresa você tem a lista de funcionários, só que a cada posição está setada como null, e para fazer com que ele seja um funcionário terá que buscar o funcionário na posição e utilizar o new Funcionario();

Dei uma modificada no seu código, veja se tem dúvida


class Funcionario {

    private String nome;
    private int rg;
    private double salario;

    public Funcionario() {
    }

    public Funcionario(String nome) {
        this.nome = nome;
    }

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

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setRg(int rg) {
        this.rg = rg;
    }

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

    public int getRg() {
        return this.rg;
    }

    public String getNome() {
        return this.nome;
    }

}
class Empresa {

    private String nome;
    private String cnpj;
    private Funcionario[] funcionarios;

    public Empresa(String nome) {
        this.nome = nome;
    }

    public Empresa() {
    }

    public void setNovosFuncionarios(int totalDeFuncionarios) {
        this.funcionarios = new Funcionario[totalDeFuncionarios];
    }

    public Funcionario getFuncionario(int posicao) {
        if(this.funcionarios[posicao] == null){
            this.funcionarios[posicao] = new Funcionario();
        }
        return this.funcionarios[posicao];
    }

    void mostraTodasInformacoes() {
        for (int i = 0; i < this.funcionarios.length; i++) {
            if (this.funcionarios[i] == null) {
                continue;
            }
            System.out.print("o funcinario " + i + " ganha " + this.funcionarios[i].getSalario());
            if (getFuncionario(i).getRg() == 0) {
                System.out.print(" Rg nao cadastrado ");
            } else {
                System.out.print("o RG do funcinario " + i + " é " + this.funcionarios[i].getRg());
            }
            if (getFuncionario(i).getNome() == null) {
                System.out.print(" nome nao cadastrado ");
            } else {
                System.out.print("o nome do funcionario " + i + " é " + this.funcionarios[i].getNome());
            }
            System.out.println(" ");
        }
    }
}

class View {

    public static void main(String[] args) {
        Empresa empresa = new Empresa("Dupont");
        empresa.setNovosFuncionarios(10);

        for (int i = 0; i < 6; i++) {
            double salario = (1000.0 + i * 100.0); //Quando for utilizar o double coloque ao menos 1 casa decimal, caso contrário dará uma exception.

class View {

public static void main(String[] args) { Empresa empresa = new Empresa("Dupont"); empresa.setNovosFuncionarios(10);

for (int i = 0; i < 6; i++) { double salario = (1000.0 + i * 100.0); empresa.getFuncionario(i).setSalario(salario); } empresa.mostraTodasInformacoes();

} }

            empresa.getFuncionario(i).setSalario(salario);
        }
        empresa.mostraTodasInformacoes();

    }
}
class View {

    public static void main(String[] args) {
        Empresa empresa = new Empresa("Dupont");
        empresa.setNovosFuncionarios(10);
        for (int i = 0; i < 6; i++) {
            double salario = (1000.0 + i * 100.0);
            empresa.getFuncionario(i).setSalario(salario);
        }
        empresa.mostraTodasInformacoes();
    }
}

O último código colei 2 vezes ¬¬