Exercícios sobre Imutabilidade
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.
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.