O Poder da Classe Enum com métodos abstratos
8372 단어 springbootjavaenumcleancode
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 inicearmos crie seu projeto Spring através do site Spring Initializr 준수 이미지 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.
협력자
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 +
'}';
}
}
티포카고
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 paraâ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 및 ColaboradorForm para testarmos nossa aplicação via Postman.
공동 작업자 저장소
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ColaboradorRepository extends JpaRepository<Colaborador,Long> {
}
Colaborador 컨트롤러
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);
}
}
Postman e vero funcionamento da nossa estratégia em utilizar o Enum을 통해 Cadastrar um colaborador에 대한 Podemos.
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 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.
github
Reference
이 문제에 관하여(O Poder da Classe Enum com métodos abstratos), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/2020nani/o-poder-da-classe-enum-com-metodos-abstratos-4di텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)