leandromoraesrj / sincad-backend

PROJETO BASE DE EXEMPLO USANDO AS MELHORES PRATICAS DE DESENVOLVIMENTO
0 stars 0 forks source link

Usando Lombok para gettres e settres #10

Open leandromoraesrj opened 2 years ago

leandromoraesrj commented 2 years ago

Como usar enum com e sem Lombok

leandromoraesrj commented 2 years ago

Para usar o Lombok:

  1. Adicionar uma dependência no maven:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>
  1. Instalar o plugin no eclipse via eclipse plugin installer (Install new software > Add)

  2. Depois reinicie o eclipse;

mais detalhes no site: https://dicasdejava.com.br/como-configurar-o-lombok-no-eclipse/

O que o Lombok faz é substituir os gettrs, settrs, toString, equal, HashCodes e contrutores (com e sem argumentos) por uma notação, fazendo com que os gettrs e settrs etc sejam gerados na compilação (maven install);

Ao incluir a notação "@Data", as outras serão incluídas automaticamente, ficando apenas, necessário, informar a notação dos construtores.

Quando estiver sendo usado numa classe generalizada, não deve informar o @HashCodeEquals nas classes filhas:

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "dac_alter_cond_insc_oficio")
public class DacAlteracaoOficioCondicaoInscricaoEstadual extends Dac {
}

Você pode adicionar o Lombok e deixar algum Settr etc específico para qualquer Enuns, Entity e Dto.

OBS: no Enum funciona somente: @Getter e @AllArgsConstructor o @Setter tem que ser no campo

@Getter
@AllArgsConstructor
public enum SituacaoCadastralEnum {
    ATIVO(1, "Ativo"), INATIVO(2, "Inativo"), INEXISTENTE(3, "Inexistente");

    @Setter
    private int cod;
    @Setter
    private String descricao;

    public static SituacaoCadastralEnum toEnum(int cod) {
        for (SituacaoCadastralEnum a : SituacaoCadastralEnum.values()) {
            if (cod != 0 && a.getCod() == cod) {
                return a;
            }
        }

        return null;
    }
}

Exemplo para um campo @Transient:

@Setter(value = AccessLevel.NONE)
@Transient
protected Integer codigoIbge;

Para mapear uma Entity (View) somente readonly, basta colocar @Immutable: OBS: Não colocar os gettrs faz com que não seja possível usar DTOs corretamente

@Immutable
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "UF")
public class Uf implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "SG_UF", length = 2)
    private String sigla;

OBS: no repository não estender ao JpaRepository para não habilitar "save" etc e deixar somente os abaixo:

List<?> findAll();
List<?> findAll(Sort sort);
List<?> findAllById(Iterable<?> siglas);
Optional<?> getById(String sigla);
long count();
boolean existsById(ID id);

Exemplo do Builder para instanciar o objeto (new object();):

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ContribuinteResponseDto {
    private Long inscricaoEstadual;

    private String cnpj;

    private String cpf;

    private String raizCnpj;

    private Integer condicaoInscricaoId;

    private Integer regimeApuracaoId;

    public ContribuinteResponseDto toDto(Contribuinte contribuinte) {
        return ContribuinteResponseDto.builder()
                .cnpj(contribuinte.getCnpj())
                .cpf(contribuinte.getCpf())
                .raizCnpj(contribuinte.getRaizCnpj())
                .condicaoInscricaoId(contribuinte.getCondicaoInscricao().getId())
                .regimeApuracaoId(contribuinte.getRegimeApuracao().getId())
                .build();
    }
}

OBS: Foi necessário informar uma notação nas coleções ao usar o @Builder, conforme:

@Builder
class MyEntity {
   @Builder.Default
   private Set<String> children = new HashSet<>();
}