So is there a reason why isn't this a OOP convention?
Meu melhor palpite: porque viola CQS
Você tem um comando (alterando o estado do objeto) e uma consulta (retornando uma cópia do estado - neste caso, o próprio objeto) misturado no mesmo método. Isso não é necessariamente um problema, mas viola algumas das diretrizes básicas.
Por exemplo, em C ++, std :: stack :: pop () é um comando que retorna void e std :: stack :: top () é uma consulta que retorna uma referência ao elemento superior na pilha. Classicamente, você gostaria de combinar os dois, mas você não pode fazer isso e ser exceção segura. (Não é um problema em Java, porque o operador de atribuição em Java não lança).
Se o DTO for um tipo de valor, você poderá alcançar um fim semelhante com
public DTO setFoo(String foo) {
return new DTO(foo, this.bar);
}
public DTO setBar(String bar) {
return new DTO(this.foo, bar);
}
Além disso, os valores de retorno do encadeamento são uma dor colossal no momento em que você está lidando com a herança. Veja o "Padrão de modelo curiosamente recorrente"
Por fim, há o problema de o construtor padrão deixar você com um objeto que esteja em um estado válido. Se você precisar executar um monte de comandos para restaurar o objeto a um estado válido, algo está errado.