Olá, Caique! Tudo bem?
Na verdade, ambas as formas estão corretas e a escolha entre uma ou outra depende do contexto do seu código.
Quando você usa o método setter dentro do construtor, como no primeiro exemplo que você mencionou, você está fazendo uso do encapsulamento. Isso significa que, se houver alguma lógica específica implementada dentro do método setter (como validações, por exemplo), essa lógica será aplicada quando você criar um novo objeto.
Por outro lado, quando você atribui o valor diretamente ao atributo, como no exemplo abaixo,
public Titulo(String nome, int anoDeLancamento) {
this.nome = nome;
this.anoDeLancamento = anoDeLancamento;
}
você está atribuindo o valor do parâmetro diretamente ao atributo do objeto. Isso é perfeitamente válido, mas não aplica nenhuma lógica adicional que possa estar presente em um método setter.
Então vai da sua necessidade: se seu método setter tem alguma lógica encapsulada, é legal usar o set
. Caso contrário, pode passar os atributos diretamente.
Espero ter ajudado e bons estudos!