Ir para o conteúdo

Exercícios sobre Imutabilidade

Questão 1

Desenvolva uma classe imutável chamada LicensePlate para representar a placa de um veículo. A classe deve armazenar o número da placa e garantir que esse valor não possa ser alterado após a criação do objeto.

Implemente um construtor que receba o número da placa e realize as validações necessárias. Considere apenas placas no formato Mercosul, por exemplo: ABC1D23.

A classe não deve possuir métodos setters. Após a criação da instância, o número da placa deve permanecer inalterado durante toda a vida do objeto.

Implemente um método de acesso para consultar o número da placa.

Adicione também um método chamado withNumber() que permita criar uma nova placa com outro número. Como a classe é imutável, esse método não deve alterar o objeto atual. Em vez disso, ele deve retornar uma nova instância com o novo valor informado.

Ao concluir a implementação, verifique que o objeto original permanece inalterado após a criação da nova placa.

Questão 2

Desenvolva uma classe imutável chamada Time para representar um horário composto por horas e minutos. A classe deve garantir que seu estado não possa ser alterado após a criação da instância.

Os valores de hora devem estar no intervalo de 0 a 23, e os valores de minuto no intervalo de 0 a 59. Realize as validações necessárias durante a construção do objeto.

Implemente métodos que permitam adicionar e subtrair horas e minutos. Como a classe é imutável, essas operações não devem modificar o objeto atual. Em vez disso, cada método deve retornar uma nova instância de Time contendo o horário resultante da operação.

Considere também situações em que a operação provoque a mudança de dia. Por exemplo, ao adicionar 30 minutos ao horário 23:45, o resultado deve ser 00:15. Da mesma forma, ao subtrair 20 minutos de 00:10, o resultado deve ser 23:50.

Implemente um método para exibir o horário no formato HH:mm, garantindo que horas e minutos sejam apresentados com dois dígitos.

Ao concluir a implementação, verifique se o objeto original permanece inalterado após cada operação, confirmando que a classe é verdadeiramente imutável. Também é recomendável implementar os métodos equals() e hashCode() para que dois objetos que representem o mesmo horário sejam considerados equivalentes.

Como desafio adicional, reimplemente a solução utilizando um record.