Ejemplo 4: Clase con funciones genéricas de validación
Descripción del Problema
Eres un desarrollador de software que necesita crear una clase en Java para validar diferentes tipos de entradas de usuario. Quieres que esta clase tenga funciones genéricas para validar números enteros, cadenas no vacías, y otros tipos de datos comunes. Además, deseas que estas funciones lancen excepciones personalizadas si la validación falla.
Solución
Primero, creamos una clase llamada InputValidator que contiene funciones genéricas para validar diferentes tipos de entradas.
package app.validate;
import app.validate.exception.InvalidDataException;
import javax.swing.*;
import java.awt.*;
public class InputValidator {
private static final Font MESSAGE_FONT = new Font("Arial", Font.PLAIN, 16);
private static final Font BUTTON_FONT = new Font("Arial", Font.BOLD, 16);
private static final Font INPUT_FONT = new Font("Arial", Font.PLAIN, 14);
static {
UIManager.put("OptionPane.messageFont", MESSAGE_FONT);
UIManager.put("OptionPane.buttonFont", BUTTON_FONT);
UIManager.put("TextField.font", INPUT_FONT);
UIManager.put("ComboBox.font", BUTTON_FONT);
}
private static String getInput(String message) {
return JOptionPane.showInputDialog(null, message);
}
private static void showMessage(String message, String title, int messageType) {
JOptionPane.showMessageDialog(null, message, title, messageType);
}
public static <T> T validateInput(String message, Class<T> type) throws InvalidDataException {
String input;
T output;
if (type.getSimpleName().equals("Boolean")) {
boolean confirmed = getConfirmation(message);
return type.cast(confirmed);
} else {
input = getInput(message);
try {
if (input == null || input.trim().isEmpty()) {
throw new InvalidDataException("El campo no puede estar vacío. Por favor, ingrese un valor válido.");
}
output = switch (type.getSimpleName()) {
case "Integer" -> type.cast(Integer.valueOf(input));
case "Double" -> type.cast(Double.valueOf(input));
case "String" -> type.cast(input.trim());
default -> throw new InvalidDataException("Unsupported data type: " + type.getSimpleName());
};
} catch (NumberFormatException e) {
showMessage("Entrada no válida.", "Error de Validación", JOptionPane.ERROR_MESSAGE);
return validateInput(message, type);
}
return output;
}
}
private static boolean getConfirmation(String message) {
int option = JOptionPane.showConfirmDialog(null, message,
"Confirmación", JOptionPane.YES_NO_OPTION);
return option == JOptionPane.YES_OPTION;
}
}
En este código, la clase InputValidator tiene una función genérica validateInput que toma un mensaje y un tipo de dato. Dependiendo del tipo de dato, la función valida la entrada del usuario y lanza una excepción personalizada InvalidDataException si la validación falla. Además, hay una función getConfirmation para manejar entradas booleanas a través de un cuadro de diálogo de confirmación.
También es importante crear la excepción personalizada InvalidDataException para manejar los casos de validación fallida.
package app.validate.exception;
public class InvalidDataException extends Exception {
public InvalidDataException(String message) {
super(message);
}
}
Analizando el Código
- La clase
InputValidatorcontiene funciones para validar diferentes tipos de entradas. - La función
validateInputes genérica y puede manejar diferentes tipos de datos, comoInteger,Double,String, yBoolean.- Para tipos numéricos, se intenta convertir la entrada a su tipo correspondiente y se lanza una excepción si la conversión falla.
- Para cadenas, se verifica que no estén vacías.
- Para booleanos, se utiliza un cuadro de diálogo de confirmación.
- Nota como en cada tipo usamos la función
type.cast()para convertir la entrada al tipo genérico especificado y el correspondienteWrapperpara manejar la conversión.
- Si la entrada no es válida, se lanza una excepción personalizada
InvalidDataExceptioncon un mensaje descriptivo. - La función
getConfirmationse utiliza para validar entradas booleanas mediante un cuadro de diálogo de confirmación.
Con esta implementación, puedes utilizar la clase InputValidator para validar diferentes tipos de entradas en tu aplicación, y manejar los errores de validación de manera efectiva utilizando excepciones personalizadas.
Ejemplo 03: Uso de Enum, Excepciones en Java
En este ejemplo, se muestra cómo utilizar enumeraciones (Enum) y manejo de excepciones en Java para crear un programa que maneje diferentes tipos de errores de manera eficiente.
Ejemplo 5: Sistema de Gestión de Empleados
Implementación de un sistema de gestión de empleados utilizando validación de datos con JOptionPane.