Uma boa prática na hora de criar os construtores de uma classe, é reaproveitar os setters dos atributos para manter a validação.

Imagine que temos a classe Carro, com seus respectivos setters:

public class Carro {
	private String marca;
	private String modelo;
	private int ano;
 
	public void setMarca(String marca) {
		this.marca = marca;
	}
 
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
 
	public void setAno(int ano) {
		if (ano > 0 && ano <= 2025) {
			this.ano = ano;
		}
	}
}

Perceba que temos uma validação no método setAno(int ano), que impede que o usuário defina um ano menor que 0 (negativo) e maior que 2025.

Agora vamos criar o construtor para a classe:

public class Carro {
	private String marca;
	private String modelo;
	private int ano;
 
	public Carro(String marca, String modelo, int ano) {
		this.marca = marca;
		this.modelo = modelo;
		this.ano = ano;
	}
 
	public void setMarca(String marca) {
		this.marca = marca;
	}
 
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
 
	public void setAno(int ano) {
		if (ano > 0 && ano <= 2025) {
			this.ano = ano;
		}
	}
}

Criando o construtor desse jeito, podemos instanciar a classe passando os seguintes parâmetros:

Carro carro = new Carro("Ferrari", "HB20", -2024);

Perceba que podemos passar o valor negativo como parâmetro do construtor, e isso é válido, já que o construtor não possui validação, apenas o setter do ano setAno(int ano).

Parra corrigir isso, é só chamarmos os setters no construtor, para manter a validação:

public class Carro {
	private String marca;
	private String modelo;
	private int ano;
 
	public Carro(String marca, String modelo, int ano) {
		setMarca(marca);
		setModelo(modelo);
		setAno(ano);
	}
 
	public void setMarca(String marca) {
		this.marca = marca;
	}
 
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
 
	public void setAno(int ano) {
		if (ano > 0 && ano <= 2025) {
			this.ano = ano;
		}
	}
}