Ferramentas necessárias:
- Java SDK
- Ide de sua preferencia
Bora galera para mais um post onde vou detalhar uma forma de utilizar a classe Enum para deixar seu código mais limpo e mais fácil de entender.
Vamos criar uma aplicação Springboot que ira cadastrar colaboradores de uma empresa (nome, cargo, bonificação), vamos utilizar o poder da classe Enum e dos métodos abstratos para gerar o salario do colaborador mais a bonificação do colaborador conforme o seu cargo.
Para iniciarmos crie seu projeto Spring através do site Spring Initializr conforme imagem abaixo
Vamos configurar nosso banco de dados H2, em application.properties coloque as seguintes configurações.
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
Nesse artigo o foco e mostrar como podemos utilizar a classe Enum com métodos abstratos para atingir uma regra de negocio e manter um código limpo, portanto não iremos nos preocupar com design patterns ou estrutura de códigos blz.
Dito isso criamos nossa classe Colaborador que será nossa Entity e a classe Enum TipoCargo.
Colaborador
package com.example.demo;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Positive;
@Entity
public class Colaborador {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
private String nome;
@NotBlank
private TipoCargo cargo;
@NotBlank
@Positive
private Double salario;
@Deprecated
public Colaborador() {
}
public Long getId() {
return id;
}
public String getNome() {
return nome;
}
public TipoCargo getCargo() {
return cargo;
}
public Double getSalario() {
return salario;
}
public Colaborador(String nome, TipoCargo cargo, Double salario) {
this.nome = nome;
this.cargo = cargo;
this.salario = salario + cargo.bonificacaoColaborador(salario);
}
@Override
public String toString() {
return "Colaborador{" +
"id=" + id +
", nome='" + nome + '\'' +
", cargo=" + cargo +
", salario=" + salario +
'}';
}
}
TipoCargo
package com.example.demo;
public enum TipoCargo {
GERENTE{
@Override
public double bonificacaoColaborador(Double salario) {
return salario * 0.1;
}
},
SUPERVISOR{
@Override
public double bonificacaoColaborador(Double salario) {
return salario * 0.20;
}
},
AJUDANTE{
@Override
public double bonificacaoColaborador(Double salario) {
return salario * 0.50;
}
},
DEV{
@Override
public double bonificacaoColaborador(Double salario) {
return salario * 0.70;
}
};
/* metodo abstrato recebe o salario do colaborador parametro*/
public abstract double bonificacaoColaborador(Double salario);
}
E aqui que a magica acontece, veja que em nossa classe Enum TipoCargo criamos um método abstrato bonificacaoColaborador que será por obrigação implementado por cada enum de nossa classe.
Este método recebe o salario do colaborador como parâmetro e retorna a porcentagem desse salario conforme o cargo especificado no enum.
Já na classe Colaborador quando passamos os valores para criar um novo colaborador, através do constructor, o salario e calculado utilizando o enum passado no corpo da requisição para chamar o método bonificacaoColaborador que será implementado conforme o valor desse enum.
Vamos criar agora as classes, ColaboradorRepositoy, ColaboradorController e ColaboradorForm para testarmos nossa aplicação via Postman.
ColaboradorRepository
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ColaboradorRepository extends JpaRepository<Colaborador,Long> {
}
ColaboradorController
package com.example.demo;
import org.springframework.http.HttpEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class ColaboradorController {
private ColaboradorRepository colaboradorRepository;
public ColaboradorController(ColaboradorRepository colaboradorRepository) {
this.colaboradorRepository = colaboradorRepository;
}
@PostMapping("/colaborador")
@Transactional
public String create(@RequestBody ColaboradorForm colaboradorForm){
Colaborador colaborador = colaboradorForm.converte();
colaboradorRepository.save(colaborador);
return colaborador.toString();
}
@GetMapping("/colaborador")
public List<Colaborador> findAll(){
return colaboradorRepository.findAll();
}
}
ColaboradorForm
package com.example.demo;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Positive;
public class ColaboradorForm {
@NotBlank
private String nome;
@NotBlank
private TipoCargo cargo;
@NotBlank
@Positive
private Double salario;
public ColaboradorForm(String nome, TipoCargo cargo, Double salario) {
this.nome = nome;
this.cargo = cargo;
this.salario = salario;
}
public Colaborador converte() {
return new Colaborador(nome, cargo, salario);
}
}
Podemos então cadastrar um colaborador via Postman e ver o funcionamento da nossa estratégia em utilizar o Enum.
Colaborador cadastrado com sucesso, e veja que passamos no corpo da requisição o salario de R$ 1000.00 mas o colaborador foi salvo no banco de dados com o salario no valor de R$1500.00
Isso porque o cargo do colaborador passado na requisição e referente ao enum no valor de AJUDANTE e este enum utiliza o método bonificacaoColaborador que acrescenta 50% a mais do valor do salario do colaborador.
Veja o que acontece se cadastrarmos este mesmo valor mas com o cargo de GERENTE.
Teve um aumento de apenas 10% conforme especificamos no enum de valor GERENTE.
A vantagem de usarmos este tipo de abordagem e que se precisarmos acrescentar novos cargos e bonificações só será necessário acrescentar valores na classe Enum TipoCargo e implementar o método bonificacaoColaborador com a regra de negocio especifica daquele cargo.
Feito galera obrigado por ler ate aqui e ate a próxima, deixo meus contatos aqui para quem quiser me adicionar.
Top comments (0)