Lógica de reserva

Boa tarde, estou com problema que ta me deixando louco kkkkkk
É o seguinte, estou fazendo um sistema de Reserva, onde tem os campos data, horaInicio e horaFim, problema está na logica de não repetir naquele suposto dia. Entenderam ? Alguém teria uma ideia de como fazer ?

não pode ter reserva naquele data e hora

Montei uma ideia aqui:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class Main {
	
	private static final DateTimeFormatter PATTERN_DATA = DateTimeFormatter.ofPattern("dd/MM/yyyy");
	private static final List<Reserva> RESERVAS = new ArrayList<>();

	public static void main(String[] args) throws Exception {
		criarReserva("15/10/2021", "13:00", "14:00");
		criarReserva("15/10/2021", "14:00", "15:00");
		criarReserva("15/10/2021", "14:59", "16:00");
		
		System.out.println("Foram feitas " + RESERVAS.size() + " reservas.");
	}
	
	private static void criarReserva(String dia, String horaInicio, String horaFim) throws Exception {
		var reserva = new Reserva(LocalDate.parse(dia, PATTERN_DATA), LocalTime.parse(horaInicio), LocalTime.parse(horaFim));
		
		if (RESERVAS.isEmpty()) {
			RESERVAS.add(reserva);
		} else {
			for (Reserva r : RESERVAS) {
				if (r.seHaConflito(reserva)) {
					throw new Exception("Não foi possível registrar a reserva " + reserva + ", pois conflitou com a reserva: " + r);
				}
			}
			
			RESERVAS.add(reserva);
		}
	}
	
	static class Reserva {
		private final LocalDateTime inicio;
		private final LocalDateTime fim;
		
		public Reserva(LocalDate inicio, LocalTime horaInicio, LocalTime horaFim) {
			this.inicio = inicio.atTime(horaInicio);
			this.fim = inicio.atTime(horaFim);
		}

		public boolean seHaConflito(Reserva reserva) {
			return 
				(seIgualOuDepois(reserva.inicio, inicio) && reserva.inicio.isBefore(fim)) ||
				(seIgualOuDepois(reserva.fim, inicio) && reserva.fim.isBefore(fim));
		}
		
		private boolean seIgualOuDepois(LocalDateTime d1, LocalDateTime d2) {
			return d1.equals(d2) || d1.isAfter(d2);
		}

		public LocalDateTime getInicio() {
			return inicio;
		}

		public LocalDateTime getFim() {
			return fim;
		}

		@Override
		public String toString() {
			return "Reserva [" + inicio.toLocalDate().format(PATTERN_DATA) + " (" + inicio.toLocalTime() + " - " + fim.toLocalTime() + ")]";
		}
	}
}

Com certeza deve dá para melhorar o código, e talvez tenha alguma falha.

1 curtida

valeu amigo, já posso tirar uma ideia de como fazer no meu sistema web, irei tentar aplicar essa ideia.