Opa, Lucas vou tentar explicar.
O código que a Amanda escreveu é bem funcional, mas se em algum momento você precisar alterar o processo de conversão, terá que modificar diretamente a classe ConverterDados
. Isso pode causar problemas se o código estiver sendo utilizado em várias partes do projeto.
Com Interface
Vamos criar uma interface Conversor
que define os métodos de conversão:
public interface Conversor {
<T> T converterObjetos(String json, Class<T> classe);
<T> List<T> conversorLista(String json, Class<T> classe);
}
Agora, a classe ConverterDados
vai implementar essa interface:
public class ConverterDados implements Conversor {
private ObjectMapper mapper = new ObjectMapper();
@Override
public <T> T converterObjetos(String json, Class<T> classe) {
try {
return mapper.readValue(json, classe);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public <T> List<T> conversorLista(String json, Class<T> classe) {
try {
return mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, classe));
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
Vantagens
Flexibilidade: Se amanhã você precisar criar um conversor que não usa ObjectMapper
, mas sim outra biblioteca, basta criar uma nova classe que implementa a interface Conversor
e substituir a implementação. Não será necessário alterar o código que depende dessa interface.
Substituição de Implementação: Você pode ter diferentes implementações de conversão para diferentes contextos (por exemplo, conversão de XML ou YAML) e alterná-las conforme necessário, sem modificar o código principal.
Exemplo de Nova Implementação
Suponha que agora você precisa de um conversor que apenas retorne o mesmo JSON (uma implementação muito simples):
public class ConversorSimples implements Conversor {
@Override
public <T> T converterObjetos(String json, Class<T> classe) {
// Retorna um objeto JSON "genérico"
return (T) json;
}
@Override
public <T> List<T> conversorLista(String json, Class<T> classe) {
// Retorna uma lista contendo apenas o JSON
return List.of((T) json);
}
}
Você pode utilizar essa nova implementação em qualquer parte do seu código que precise de uma conversão mais simples, sem mudar a lógica existente.
Com isso o código fica mais organizado e mais flexível a mudanças.