Validar datas e fazer testes - Java

Sou iniciante em Java e estou tentando dificuldades para implementar o seguinte código…

Implementar em Java as classes representadas no diagrama de classes e implementar a classe, com a função main , para testar as funcionalidades do exercício.

a) Criar uma classe data com os atributos dia, mês e ano, realizando os testes para saber se é uma data válida.

b) Usando herança, criar as classes Pessoa, Aluno e Funcionário

c) Usando associação entre classes, criar na classe Pessoa o atributo Data de Nascimento do tipo Data (classe do item a)

d) Na classe Aluno deverá existir um atributo Data da Matricula que deverá ser do tipo Data (classe do item a)

e) Na classe Funcionário deverá existir um atributo Data de Admissão que deverá ser do tipo Data (classe do item a)

f) Criar uma classe Teste com um menu para cadastrar aluno e funcionário.

image

Já tive problemas para conseguir validar as datas (acredito que tenha que ser feito por tratamento de exceção, porém não consegui achar a saída). Não estou conseguindo criar a classe main para fazer os testes também, e isso não sei pq :woman_shrugging:t2:

Alguém me ajuda, please??

edit: vou postar meu código até onde conseguir fazer…

public class Pessoa {
	
	private String nome;
	private String sobrenome;
	Data dataNascimento;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSobrenome() {
		return sobrenome;
	}

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}
}
public class Aluno extends Pessoa {

	private int matricula;
	public Data dataMatricula;

	public int getMatricula() {
		return matricula;
	}

	public void setMatricula(int matricula) {
		this.matricula = matricula;
	}
}
public class Funcionario extends Pessoa {
	
	private int codigoFunc;
	public Data dataAdmissao;

	public int getCodigoFunc() {
		return codigoFunc;
	}

	public void setCodigoFunc(int codigoFunc) {
		this.codigoFunc = codigoFunc;
	}
}
public class Data {

	public int dia;
	public int mes;
	public int ano;
}

A classe vc já criou conforme o que foi pedido. E ela deve permitir que uma data válida seja criada. Vou tentar exemplificar aqui a forma como costumo fazer. Dependendo do seu nível de conhecimento, talvez vc tenha dúvidas, mas, se tiver, soh perguntar que nós explicaremos.

Antes, vou alterar a classe de data que vc criou para permitir que uma data seja criada a partir de um construtor:

Data

public class Data {

	private final int dia;
	private final int mes;
	private final int ano;
	
	private Data(int dia, int mes, int ano) {
		this.dia = dia;
		this.mes = mes;
		this.ano = ano;
		
		validar();
	}
	
	public static Data of(String data) {
		String[] parts = data.split("/");
		return new Data(
				Integer.valueOf(parts[0]), 
				Integer.valueOf(parts[1]), 
				Integer.valueOf(parts[2]));
	}
	
	public static Data of(int dia, int mes, int ano) {
		return new Data(dia, mes, ano);
	}
	
	private void validar() {
		if (dia < 1 || dia > 31) {
			throw new IllegalArgumentException("Dia deve ser entre 1 e 31");
		}
	}
	
	public int getDia() {
		return dia;
	}

	public int getMes() {
		return mes;
	}

	public int getAno() {
		return ano;
	}
	
	public String getComoTexto() {
		return dia + "/" + mes + "/" + ano;
	}
}

DataTest

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

class DataTest {

	@Test
	void deveCriarDataAPartirDoDiaMesAno() {
		Data actual = Data.of(1, 1, 2000);
		Assertions.assertEquals("1/1/2000", actual.getComoTexto());
	}
	
	@Test
	void deveCriarDataAPartirDaString() {
		Data actual = Data.of("01/01/2000");
		Assertions.assertEquals(1, actual.getDia());
		Assertions.assertEquals(1, actual.getMes());
		Assertions.assertEquals(2000, actual.getAno());
	}
	
	@Test
	void deveLancarExcecaoQuandoDiaForInvalido() {
		IllegalArgumentException exception = Assertions.assertThrows(IllegalArgumentException.class, () -> Data.of("32/01/2000"));
		Assertions.assertEquals(exception.getMessage(), "Dia deve ser entre 1 e 31");
	}
}
1 curtida

Fiz uma alteração no método validar no código do @Lucas_Camara, irá verificar caso o mês tenha apenas até o dia 28, o mês não vai passar de 12, ano ficará entre 1900 e 2999, segue abaixo::coffee::coffee:

public class Data {

	private final int dia;
	private final int mes;
	private final int ano;

	private Data(int dia, int mes, int ano) {
		this.dia = dia;
		this.mes = mes;
		this.ano = ano;

		validar();
	}

	public static Data of(String data) {
		String[] parts = data.split("/");
		return new Data(Integer.valueOf(parts[0]), Integer.valueOf(parts[1]), Integer.valueOf(parts[2]));
	}

	public static Data of(int dia, int mes, int ano) {
		return new Data(dia, mes, ano);
	}

	private void validar() {
		if (ano < 1900 || ano > 2999 || mes < 1 || mes > 12 || dia < 1 || dia > 31) {
			throw new IllegalArgumentException("Data inválida!");
		} else if ((dia <= 31) && (mes <= 12)) {
			if (((dia > 28) && (mes == 2)) || ((dia == 31) && ((mes == 4) || (mes == 6) || (mes == 9) || (mes == 11)))) {
				throw new IllegalArgumentException("Data inválida!");
			} else {
				//Caíra nesse bloco se for válida!
				System.out.println("Data válida");
			}
		} else {
			throw new IllegalArgumentException("Data inválida!");
		}
	}

	public int getDia() {
		return dia;
	}

	public int getMes() {
		return mes;
	}

	public int getAno() {
		return ano;
	}

	public String getComoTexto() {
		return dia + "/" + mes + "/" + ano;
	}
}
1 curtida