Cara, eu não sei se é a melhor forma, mas eu faço o seguinte: Eu crio uma classe que será o DTO de algum objeto, e dentro dela, eu coloco todos os atributos. Após isso, eu coloco um construtor normal, com os atributos como parâmetro, e um outro construtor que recebe o objeto original como parâmetro. Esse seria o "toDTO". Depois eu crio um método chamado "to(nome do seu objeto)Object", e nesse método, ele retorna uma instância do objeto original utilizando as propriedades que estão no DTO. E o negócio de usar todos os atributos, é que não precisa criar 2 DTOs, um para requisição e outro de resposta, porque caso use ele como requisição, o usuário só vai instanciá-lo passando os parametros que você definiu no constructor; e como resposta, é só instanciá-lo passando um objeto original como parâmetro do constructor. Isso é bom porque talvez você queira que algumas propriedades sejam retornadas na resposta, porém não quer que elas sejam preenchidas na hora da criação, aí você define isso com os constructors. No constructor padrão, você decide quais propriedades serão iniciadas, e no constructor que recebe um objeto, você decide quais propriedades você quer exibir do objeto original.
Enfim, não sei se essa é a melhor prática, mas eu utilizo esse e funciona muito bem para o que eu preciso, e além de ficar clean, não precisa criar 2 DTOs diferentes.