Glosario Bloque 01: Fundamentos de POO
Sección 01 Parte 1: Conceptos Básicos
Programación Orientada a Objetos (POO)
Definición: Paradigma de programación que modela el software como una colección de objetos que interactúan entre sí, cada uno con estado (atributos) y comportamiento (métodos).
Ejemplo de uso: En POO, un Player
en un videojuego tiene atributos como health
y métodos como attack()
.
Clase
Definición: Plantilla o molde que define un conjunto de atributos y métodos comunes a todos los objetos que se creen a partir de ella.
Ejemplo de uso: La clase Car
define qué atributos y comportamientos tendrán todos los autos, como startEngine()
o model
.
Objeto
Definición: Instancia concreta de una clase. Es una entidad con valores específicos para sus atributos y acceso a sus métodos.
Ejemplo de uso: myCar = new Car("blue", "Toyota")
crea un objeto de la clase Car
.
Instancia
Definición: Representación específica de una clase cuando se crea un objeto a partir de ella.
Ejemplo de uso: Cada torta hecha con una receta es una instancia diferente de esa receta (clase).
Atributo
Definición: Propiedad o característica de un objeto. Corresponde a una variable definida dentro de una clase.
Ejemplo de uso: En la clase Person
, el atributo name almacena el nombre del individuo.
Método
Definición: Comportamiento o función que puede realizar un objeto, definido dentro de su clase.
Ejemplo de uso: El método greet()
en la clase Person
permite al objeto decir su nombre y edad.
Encapsulamiento
Definición: Principio que consiste en ocultar los detalles internos de los objetos y exponer solo lo necesario mediante métodos públicos.
Ejemplo de uso: La clase Car
no permite acceso directo al atributo engineOn
, sino que lo modifica mediante start()
y stop()
.
Modularidad
Definición: Organización del código en módulos o componentes independientes y reutilizables que se comunican entre sí.
Ejemplo de uso: CarService
gestiona la lógica de conducción sin modificar directamente la clase Car
.
Paradigma
Definición: Enfoque o estilo de programación. Puede ser estructurado, orientado a objetos, funcional, etc.
Ejemplo de uso: La POO es un paradigma que modela entidades reales como clases y objetos.
Programación Estructurada
Definición: Paradigma de programación centrado en funciones y secuencia de instrucciones, sin clases ni objetos.
Ejemplo de uso: Un programa en C que calcula promedios mediante funciones sería estructurado, no orientado a objetos.
Entidad (Entity)
Definición: En DDD (Domain-Driven Design), una clase que representa un concepto central del dominio, con identidad propia.
Ejemplo de uso: Pet
es una entidad del sistema de registro de mascotas.
Servicio (Service)
Definición: Clase que agrupa lógica de negocio que no pertenece directamente a una sola entidad.
Ejemplo de uso: CarService
verifica si el motor está encendido antes de conducir el auto.
Prueba Unitaria (Unit Test)
Definición: Código que verifica el comportamiento esperado de métodos o clases individuales.
Ejemplo de uso: En CarTest
, se prueba que start()
y stop()
cambien correctamente el estado del motor.
Abstracción
Definición: Representación simplificada de una entidad del mundo real, resaltando lo esencial y ocultando detalles innecesarios.
Ejemplo de uso: La clase Student
modela un estudiante, sin entrar en detalles como su dirección física.
Herencia
Definición: Mecanismo por el cual una clase puede adquirir atributos y métodos de otra clase.
Ejemplo de uso (implícito): Una clase Dog
podría heredar de Animal
en un sistema de mascotas.
Composición
Definición: Relación entre clases donde una contiene una instancia de otra como parte de su definición.
Ejemplo de uso (implícito): La clase Owner
puede tener una lista de objetos Pet
.
Polimorfismo
Definición: Capacidad de una misma operación de actuar de manera diferente según el objeto que la invoque.
Ejemplo de uso (implícito): Un método printInfo()
puede comportarse distinto en Book
y Magazine
.
Responsabilidad Única (SRP - Single Responsibility Principle)
Definición: Cada clase debe tener una única razón para cambiar, es decir, una responsabilidad única.
Ejemplo de uso: La clase Person
solo gestiona datos de personas; CarService
solo gestiona lógica de conducción.
Open/Closed Principle (OCP)
Definición: Las clases deben estar abiertas a extensión pero cerradas a modificación.
Ejemplo de uso: Podemos extender Car
con nuevos métodos sin cambiar su implementación original.
Sección 01 Parte 2: Introducción a POO
Clase Abstracta
Definición: Clase que no se puede instanciar directamente y que sirve como base para otras clases. Puede contener métodos abstractos (sin implementación) que deben ser sobreescritos por las subclases.
Ejemplo de uso: La clase Animal
es abstracta y define el método makeSound()
que será implementado por Dog
, Cat
, etc.
Paquete (Package)
Definición: Mecanismo de organización del código fuente en Java que agrupa clases relacionadas dentro de un espacio de nombres común.
Ejemplo de uso: La clase BankAccount
puede estar en el paquete edu.usta.domain
, mientras que BankAccountTest
en edu.usta.test
.
Jerarquía de Clases
Definición: Estructura en forma de árbol donde las clases se organizan por niveles de herencia, desde clases más generales (superclases) hasta más específicas (subclases).
Ejemplo de uso: Vehicle
es la superclase de Car
, Bike
y Truck
en un sistema de transporte.
Principio de Sustitución de Liskov (Liskov Substitution Principle – LSP)
Definición: Principio SOLID que establece que los objetos de una subclase deben poder reemplazar a los de su superclase sin afectar el correcto funcionamiento del sistema.
Ejemplo de uso: Si Dog
y Cat
heredan de Animal
, ambos deben comportarse correctamente al ser usados donde se espera un Animal
.
Principio de Segregación de Interfaces (Interface Segregation Principle – ISP)
Definición: Principio SOLID que sugiere que es mejor tener muchas interfaces específicas que una única interfaz general que obligue a implementar métodos innecesarios.
Ejemplo de uso: Es preferible tener una interfaz Flyable
para animales que vuelan y Swimmable
para los que nadan, en lugar de una interfaz AnimalBehavior
con métodos que no todos usan.
Patrón Template Method
Definición: Patrón de diseño en el que una clase abstracta define la estructura general de un algoritmo y permite que sus subclases implementen pasos específicos.
Ejemplo de uso: Animal
define makeSound()
como método abstracto, y cada subclase (Dog
, Cat
) proporciona su propio comportamiento.
Patrón Strategy
Definición: Patrón de diseño que permite definir una familia de algoritmos, encapsularlos y hacerlos intercambiables sin modificar el código del cliente.
Ejemplo de uso: Si el comportamiento makeSound()
se delega a clases como BarkBehavior
o MeowBehavior
, el sistema puede cambiar dinámicamente cómo suenan los animales.
Sección 02: POJO y UML Básico
POJO (Plain Old Java Object)
Definición: Objeto Java simple que no depende de frameworks ni librerías externas. Se usa para representar datos puros del dominio.
Ejemplo de uso: La clase Book
es un POJO que contiene título, autor, año e ISBN sin lógica adicional.
Setter y Getter
Definición: Métodos que permiten modificar (set) y acceder (get) a los atributos privados de una clase.
Ejemplo de uso: getTitle()
devuelve el título del libro, y setTitle("Nuevo título")
lo actualiza.
toString()
Definición: Método de la clase Object en Java que retorna una representación en texto del objeto. Se puede sobreescribir para mostrar información personalizada.
Ejemplo de uso: System.out.println(book)
imprimirá "Clean Code by Robert C. Martin (2008)" si toString()
está sobreescrito.
equals() y hashCode()
Definición: Métodos utilizados para comparar objetos y almacenarlos eficientemente en colecciones como HashMap o HashSet.
Ejemplo de uso: Se sobreescriben para que dos libros con el mismo ISBN sean considerados iguales.
UML (Unified Modeling Language)
Definición: Lenguaje visual estandarizado para modelar sistemas orientados a objetos, incluyendo su estructura y comportamiento.
Ejemplo de uso: El diagrama de clases UML muestra las clases Book
, User
y Loan
y sus relaciones.
Diagrama de Clases
Definición: Tipo de diagrama UML que representa las clases de un sistema, sus atributos, métodos y relaciones (herencia, composición, agregación).
Ejemplo de uso: En el sistema de biblioteca, el diagrama de clases representa que Loan
tiene relación de agregación con Book
y User
.
Agregación (en UML)
Definición: Relación en la que una clase contiene referencias a otras como parte de su estructura, sin ser dueña exclusiva de ellas.
Ejemplo de uso: Loan o-- Book
indica que un préstamo se asocia a un libro, pero el libro puede existir sin el préstamo.
PlantUML
Definición: Herramienta que permite generar diagramas UML usando código textual.
Ejemplo de uso: Con PlantUML se puede escribir class Book { +getTitle(): String }
para generar un diagrama de clase.
Value Object (Patrón de Diseño)
Definición: Objeto que representa datos sin identidad propia, usado para transportar información.
Ejemplo de uso: Book
es un value object si solo interesa su contenido (título, autor...) y no su identidad única.
LocalDate (Java)
Definición: Clase de Java (java.time
) que representa una fecha sin hora.
Ejemplo de uso: El atributo date en la clase Loan
es de tipo LocalDate
.
Sección Bonus: Unit Testing con JUnit para JDK 21+
JUnit 5
Definición: Framework moderno y modular para ejecutar pruebas unitarias en Java. Incluye API, plataforma de ejecución y soporte para versiones anteriores.
Ejemplo de uso: Usamos @Test
de JUnit 5 para verificar que el método add()
funcione correctamente.
JUnit Jupiter
Definición: Módulo principal de JUnit 5 que proporciona la API de pruebas moderna, anotaciones como @Test
y utilidades para aserciones.
Ejemplo de uso: JUnit Jupiter
permite usar assertEquals()
y assertThrows()
para validar resultados esperados.
JUnit Platform
Definición: Componente base de JUnit 5 encargado de lanzar y administrar las ejecuciones de pruebas en distintos entornos.
Ejemplo de uso: Herramientas como Maven o IntelliJ usan la JUnit Platform para correr pruebas desde la línea de comandos o el IDE.
JUnit Vintage
Definición: Módulo de JUnit 5 que permite ejecutar pruebas escritas con JUnit 3 y 4.
Ejemplo de uso: Un proyecto antiguo puede seguir usando pruebas clásicas si se añade JUnit Vintage.
Apache Maven
Definición: Herramienta de automatización y gestión de proyectos Java, que facilita la compilación, testing, empaquetado y dependencia de librerías.
Ejemplo de uso: Usamos Maven para compilar el proyecto con mvn compile
y ejecutar pruebas con mvn test
.
pom.xml
Definición: Archivo de configuración central de un proyecto Maven. Define las dependencias, plugins y propiedades del proyecto.
Ejemplo de uso: Añadir la dependencia de junit-jupiter en el pom.xml
permite usar JUnit 5 en el proyecto.
exec-maven-plugin
Definición: Plugin de Maven que permite ejecutar clases Java directamente desde la línea de comandos.
Ejemplo de uso: Se configura este plugin en el pom.xml
para ejecutar App.java
con mvn exec:java
.
Aserción
Definición: Expresión lógica en un test que valida que una salida sea igual a lo esperado. Si falla, la prueba se considera incorrecta.
Ejemplo de uso: assertEquals(5, calc.add(2, 3))
comprueba que la suma da el resultado esperado.
@BeforeEach, @AfterEach, @BeforeAll, @AfterAll
Definición: Anotaciones de JUnit 5 que permiten ejecutar métodos auxiliares antes o después de una o todas las pruebas.
Ejemplo de uso: @BeforeEach
prepara el entorno antes de cada test, como instanciar una clase.
Maven Surefire Plugin
Definición: Plugin que permite ejecutar pruebas unitarias automáticamente al compilar el proyecto con Maven.
Ejemplo de uso: Las pruebas en CalculatorTest.java
se ejecutan con mvn test gracias a maven-surefire-plugin
.
assertThrows()
Definición: Método de JUnit 5 que verifica que una excepción específica sea lanzada al ejecutar cierto código.
Ejemplo de uso: assertThrows(IllegalArgumentException.class, () -> calc.divide(5, 0))
asegura que se lanza una excepción al dividir por cero.
Sección 03: Constructores, Getters y Setters, toString
Constructor
Definición: Método especial que se ejecuta automáticamente al crear un objeto con new. Se usa para inicializar atributos y definir el estado inicial de la instancia.
Ejemplo de uso: Student s = new Student("Ana", "S001", 4.5);
crea un estudiante con datos iniciales.
Constructor Implícito
Definición: Constructor sin parámetros que Java crea automáticamente si la clase no define uno explícitamente.
Ejemplo de uso: Si Book
no define constructores, Java añade public Book() {}
por defecto.
Constructor Vacío
Definición: Constructor definido manualmente sin parámetros, que permite crear objetos sin inicializar atributos de inmediato.
Ejemplo de uso: new Product()
usa el constructor vacío para luego usar setters.
Constructor con Parámetros
Definición: Constructor que recibe argumentos para inicializar directamente los atributos del objeto.
Ejemplo de uso: new Product("Mouse", "P001", 29.99, 10);
crea un objeto con datos definidos desde el inicio.
Sobrecarga de Constructores (Constructor Overloading)
Definición: Definir múltiples constructores en la misma clase con diferentes listas de parámetros, permitiendo formas flexibles de instanciación.
Ejemplo de uso: Book
puede tener constructores con 0, 1 o 2 parámetros para mayor versatilidad.
Acceso Controlado
Definición: Principio del encapsulamiento en el que se accede a los atributos de una clase solo mediante métodos públicos (getters y setters).
Ejemplo de uso: student.setGpa(4.5)
aplica validación antes de modificar el atributo.
Formato uniforme en toString()
Definición: Técnica recomendada para mostrar el estado del objeto en texto con una estructura clara y consistente.
Ejemplo de uso: "Student{name='Ana', id='S001', gpa=4.2}"
es un formato legible para depuración y registros.
Sección 04: Enums, String, StringBuffer y StringBuilder
enum (Enumeración)
Definición: Tipo especial de clase que define un conjunto fijo de constantes con nombre. Ideal para representar estados, categorías o roles inmutables.
Ejemplo de uso: UserStatus status = UserStatus.ACTIVE
; define el estado de un usuario con un valor seguro y validado.
ordinal()
Definición: Método de enum que devuelve la posición (índice) de una constante dentro de la enumeración, comenzando desde 0.
Ejemplo de uso: Priority.HIGH.ordinal()
devuelve 0.
valueOf(String)
Definición: Método de enum que convierte una cadena de texto al valor correspondiente de la enumeración.
Ejemplo de uso: UserStatus.valueOf("SUSPENDED")
devuelve UserStatus.SUSPENDED
.
StringBuffer
Definición: Clase mutable y sincronizada para manipulación eficiente de texto en entornos multihilo. Pertenece a java.lang
.
Ejemplo de uso: sb.append(" nuevo texto");
modifica el contenido sin crear un nuevo objeto.
StringBuilder
Definición: Versión no sincronizada de StringBuffer, más rápida para uso en un solo hilo. También mutable.
Ejemplo de uso: new StringBuilder("Hola").append(" mundo")
concatena cadenas de forma eficiente.
reverse()
Definición: Método que invierte el contenido de un StringBuffer o StringBuilder.
Ejemplo de uso: "Java"
se convierte en "avaJ"
con reverse()
.
capacity()
Definición: Método que retorna la capacidad interna (en caracteres) del buffer de un StringBuilder o StringBuffer, no confundir con length()
.
Ejemplo de uso: new StringBuilder().capacity()
devuelve 16 por defecto.
CharSequence
Definición: Interfaz que representa una secuencia legible de caracteres. String, StringBuffer y StringBuilder la implementan.
Ejemplo de uso: Métodos que aceptan CharSequence
pueden recibir cualquiera de esas tres clases.
Thread-safe
Definición: Propiedad que indica que una clase o método puede ser usado de forma segura en contextos de múltiples hilos simultáneamente.
Ejemplo de uso: StringBuffer es thread-safe, mientras que StringBuilder no lo es.
String Pool
Definición: Área especial de memoria donde Java almacena internamente literales de cadenas para optimizar uso de memoria y evitar duplicados.
Ejemplo de uso: String a = "hola"; String b = "hola";
→ ambas referencias apuntan al mismo objeto del pool.
Comparación por contenido (equals())
Definición: Método que compara el contenido de dos objetos String.
Ejemplo de uso: "Java".equals("Java")
→ true, mientras que "Java" == "Java"
compara referencias, no contenido.
Benchmark
Definición: Prueba de rendimiento que mide el tiempo de ejecución de fragmentos de código para comparar eficiencia.
Ejemplo de uso: Se comparan String, StringBuffer y StringBuilder para concatenar 100,000 caracteres.