Ejemplos

Ejemplo 4: Clase con funciones genéricas de validación

En este ejemplo, crearemos una clase `InputValidator` que contiene funciones genéricas para validar diferentes tipos de entradas, como números enteros, correos electrónicos y fechas. Estas funciones lanzarán excepciones personalizadas si la validación falla.

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 InputValidator contiene funciones para validar diferentes tipos de entradas.
  • La función validateInput es genérica y puede manejar diferentes tipos de datos, como Integer, Double, String, y Boolean.
    • 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 correspondiente Wrapper para manejar la conversión.
  • Si la entrada no es válida, se lanza una excepción personalizada InvalidDataException con un mensaje descriptivo.
  • La función getConfirmation se 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.

Este ejemplo se centra en la validación de entradas utilizando funciones genéricas y excepciones personalizadas. Puedes expandir esta clase para incluir más tipos de validación según tus necesidades.
Copyright Jesús Aurelio Castro Magaña © 2026