Ir ao conteúdo

Posts recomendados

Postado

Opa, estou treinando orientação a objeto na linguagem Java. Estarei postando um código e gostaria que me dissessem no que eu posso melhorar.

///classe main
package Exercicio7POO;

public class App {
 
    public static void main(String[] args) {
        Funcionario f1 = new Funcionario ("Joao", "Emboabs", 1200);
        Funcionario f2 = new Funcionario ("Caio", "Nevs", 1300);
   
        System.out.println("Nome: " + f1.getPrimeiroNome() + "\nSobrenome: " + f1.getSobrenome() + "\nSalario anual: " + f1.salarioAnual());
        System.out.println("Nome:" + f2.getPrimeiroNome() + "\nSobrenome: " + f2.getSobrenome() + "\nSalario anual: " + f2.salarioAnual());
   
        
        System.out.println("Houve um aumento de 10%!");
        System.out.println("Salario anual do " + f1.getPrimeiroNome() + ": " + f1.aumentoSalario());
        System.out.println("Salario anual do " + f2.getPrimeiroNome() + ": " + f2.aumentoSalario());
    }
}

///classe objeto

package Exercicio7POO;


public class Funcionario {
    
    private String primeiroNome;
    private String sobrenome;
    private float salarioMensal;

    public Funcionario(String primeiroNome, String sobrenome, float salarioMensal) {
        this.primeiroNome = primeiroNome;
        this.sobrenome = sobrenome;
        this.salarioMensal = salarioMensal;
    }
  
    public float salarioAnual(){    
        return salarioMensal * 12;
    }
    
    public float aumentoSalario(){
        return (salarioMensal * 12) / (0.1f * salarioMensal) + (salarioMensal * 12);
    }

    public String getPrimeiroNome() {
        return primeiroNome;
    }

    public void setPrimeiroNome(String primeiroNome) {
        this.primeiroNome = primeiroNome;
    }

    public String getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }

    public float getSalarioMensal() {
        return salarioMensal;
    }

    public void setSalarioMensal(float salarioMensal) {
        this.salarioMensal = salarioMensal;
    } 
    
}

 

  • Obrigado 1
  • 2 semanas depois...
Postado

O getters e setters estão certos, não tem muito segredo nesse caso. Mas caso faça um outro programa em que o salário ou nome não possam ser modificados por exemplo, então nesse caso não precisa de setters, assim o código ficaria mais limpo. O que dá pra melhorar no seu programa é você formatar o salário com printf ao invés de println. Assim você consegue deixar aqueles 2 dígitos de centavos depois da vírgula, não sei se você já aprendeu, aqueles "%0.2f"

Postado

Eu separaria a lógica de aplicação de aumento da classe de modelagem. Além disso, no seu código o aumento não está sendo atribuído ao salário, nesse caso, se você consultar o salário novamente depois de aplicar o aumento, o valor retornado será o antigo.

 

Veja se ajuda:

public class Principal implements Runnable {

    public static void main(String[] args) {
        new Principal().run();
    }


    private void aplicarAumentoSalarial(double porcentagem, Funcionario funcionario) {
        double salario = funcionario.getSalario();

        salario += salario * porcentagem / 100.0;

        funcionario.setSalario(salario);
    }


    @Override
    public void run() {
        Funcionario f1 = new Funcionario("Funcionário", "Um", 1000);
        Funcionario f2 = new Funcionario("Funcionário", "Dois", 790);

        System.out.println(f1);
        System.out.println(f2);

        aplicarAumentoSalarial(10, f1);
        aplicarAumentoSalarial(10, f2);

        System.out.println(f1);
        System.out.println(f2);
    }


    private static class Funcionario {

        private String nome;
        private String sobrenome;
        private double salario;

        public Funcionario(String nome, String sobrenome, double salario) {
            this.nome      = nome;
            this.sobrenome = sobrenome;
            this.salario   = salario;
        }

        public String getNome() {
            return nome;
        }

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

        public double getSalario() {
            return salario;
        }

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

        public String getSobrenome() {
            return sobrenome;
        }

        public void setSobrenome(String sobrenome) {
            this.sobrenome = sobrenome;
        }

        @Override
        public String toString() {
            return "Funcionario{" +
                   "nome='" + nome + '\'' +
                   ", sobrenome='" + sobrenome + '\'' +
                   ", salario=" + salario +
                   ", salarioAnual=" + (salario * 12) +
                   '}';
        }
    }
}

 

  • Curtir 1
Postado

@AdrianoSiqueira Uma pergunta: você acha necessário chamar o run(). Porque em alguns projetos que fiz, quando você implementa o runnable e sobrescreve ele (@Override), o método é executado automaticamente quando um novo objeto é criado. Então por exemplo quando eu crio new Principal(); já funciona. Mas talvez seria boa prática deixar o run() mesmo assim?

Postado

@Felipecfk Então, precisaria ver como estava o código, porque teoricamente não era para funcionar.

 

Veja esse exemplo:

public class Scratch implements Runnable {

    public static void main(String[] args) {
        new Scratch();
    }

    @Override
    public void run() {
        System.out.println("Run");
    }
}

Essa implementação não irá escrever nada na tela.

 

Agora veja essa:

public class Scratch implements Runnable {

    public Scratch() {
        run();
    }

    public static void main(String[] args) {
        new Scratch();
    }

    @Override
    public void run() {
        System.out.println("Run");
    }
}

Essa implementação vai escrever run na tela, mas perceba que o método run() está sendo chamado dentro do construtor.

 

Não posso afirmar nada sobre o código que você mencionou, mas eu daria um palpite que foi implementado mais ou menos assim, com o construtor chamando o run().

Postado
Em 21/06/2022 às 14:38, AdrianoSiqueira disse:

@Felipecfk Então, precisaria ver como estava o código, porque teoricamente não era para funcionar.

 

Agora veja essa:

Não posso afirmar nada sobre o código que você mencionou, mas eu daria um palpite que foi implementado mais ou menos assim, com o construtor chamando o run().

Esse código faz parte de um tutorial de um game plataforma, estou fazendo junto pra aprender. Eu acho que já sei o que aconteceu, existe uma função loop no construtor sendo chamada e dentro desse loop existe uma thread recebendo como parâmetro a própria classe e também está executando a função start();
Então se fizer como o exemplo abaixo funciona, sem chamar o run() no main:

 

public class Main {
	
	public static void main(String[] args) {
		new Sec();
	}
}

public class Sec implements Runnable {

	Thread td;
	
	public Sec() {
		loop();
	}
	
	private void loop() {
		td = new Thread(this);
		td.start();
	}
	
	@Override
	public void run() {
		System.out.println("Run");
	}
}


Deixei as duas classes no mesmo pacote só pra facilitar o exemplo. A palavra Sec é de "secundário", só pra dizer que não é a main.

Postado
17 horas atrás, Felipecfk disse:

existe uma função loop no construtor sendo chamada e dentro desse loop existe uma thread recebendo como parâmetro a própria classe e também está executando a função start();

 

Exatamente, o método main() chama o construtor de Sec, que chama o método loop(), que chama o método start(). Internamente, o start() chama o método run() do Runnable que foi fornecido, nesse caso a instância da própria Sec.

 

Moral da história: o método run() precisa ser chamado, mas as vezes alguma classe já faz isso por você (por exemplo a própria classe Thread).

 

17 horas atrás, Felipecfk disse:

Esse código faz parte de um tutorial de um game plataforma

Fiquei curioso sobre esse código, ele está no github?

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!