Tipos de Clases en Java
Aunque Java no categoriza las clases en “tipos” como tal, en este artículo te ofrezco una clasificación práctica, de acuerdo a su funcionalidad y características. Las clases en Java son un concepto fundamental que ha existido desde las primeras versiones del lenguaje, y a lo largo de las diferentes versiones de Java, se han agregado características y mejoras al lenguaje, algunos de estos cambios están relacionados con las clases.
Contenido
Clases Regulares o de Programador
Clases Regulares o de Programador
Este tipo de clases, son las clases estándar que los programadores crean para modelar objetos y comportamientos en sus aplicaciones. No hay ninguna distinción especial en las diferentes versiones de Java.
public class Usuario {
private final String nombre;
private final String apellido;
private final String email;
public Usuario(String nombre, String apellido, String email) {
this.nombre = nombre;
this.apellido = apellido;
this.email = email;
}
public String getNombreCompleto() {
return String.format("%s %s", nombre, apellido);
}
public String getNombre() {
return nombre;
}
public String getApellido() {
return apellido;
}
public String getEmail() {
return email;
}
}
Para saber más sobre las clases regulares de Java, lee este artículo sobre clases en Java.
Clases Enumeradas (Enums)
Las clases enumeradas son un tipo especial de clase que representa un conjunto fijo de valores, como días de la semana o tipos de cartas en una baraja. A partir de versiones anteriores de Java, las clases Enum se han mejorado en términos de concurrencia y desempeño.
public enum DiaSemana {
LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO
}
// Uso de la clase enum
var algunDia = DiaSemana.LUNES;
switch (algunDia) {
case LUNES -> System.out.println("¡Ve al gimnasio!");
}
Clases Anidadas o Internas (Nested/Inner Classes)
Las clases anidadas son clases definidas dentro de otras clases. Este tipo de clases pueden ser estáticas o no estáticas. La anidación de clases se ha permitido en Java desde sus primeras versiones.
Ejemplos:
public class ClaseExterna {
// Miembros de la clase externa
public class ClaseAnidada {
// Miembros de la clase anidada
}
}
public class ClaseExterna {
private static int x = 10;
public static class ClaseAnidadaEstatica {
public void mostrarValorExterno() {
System.out.println("Valor de x en la clase externa: " + x);
}
}
}
public class ClaseExterna {
private int x = 10;
public void metodoExterno() {
class ClaseLocal {
public void mostrarValorExterno() {
System.out.println("Valor de x en la clase externa: " + x);
}
}
ClaseLocal local = new ClaseLocal();
local.mostrarValorExterno();
}
}
Clases Anónimas
Las clases anónimas son clases que se crean sin un nombre y se utilizan para implementar interfaces o clases abstractas en el lugar donde se necesitan.
Aquí un ejemplo de este tipo de clases:
InterfazEjemplo miObjeto = new InterfazEjemplo() {
public void metodoEjemplo() {
System.out.println("Implementación de método en clase anónima.");
}
};
Clases Funcionales
Las clases funcionales son un concepto relacionado con las lambdas y las expresiones lambda introducidas en versiones recientes de Java. Este tipo de clases tienen un único método abstracto y se pueden representar como instancias de interfaces funcionales.
Las clases en Java son un concepto esencial que ha estado presente desde las primeras versiones del lenguaje. Puedes utilizar diferentes tipos de clases según las necesidades de tu aplicación y aprovechar las características introducidas en versiones más recientes de Java para mejorar tu código.
Aquí te muestro un ejemplo de clase funcional:
@FunctionalInterface
interface OperacionMatematica {
int operar(int a, int b);
}
// Uso de una expresión lambda para implementar la interfaz funcional
OperacionMatematica suma = (a, b) -> a + b;
Clases Selladas (Sealed Classes)
Las clases selladas son un nuevo tipo de clase que se introdujo en Java 16. Estas clases permiten definir un conjunto explícito de subclases permitidas. En otras palabras, puedes especificar cuáles clases pueden extender una clase sellada. Esto proporciona un mayor control y seguridad en la jerarquía de clases.
Ejemplo:
public sealed class Figura permits Circulo, Triangulo {
// Contenido de la clase base
}
final class Circulo extends Figura {
// Contenido de la subclase
}
non-sealed class Triangulo extends Figura {
// Contenido de la subclase
}
Registros (Java Records)
Los registros en Java son una adición interesante
que simplifica la creación de clases que representan datos inmutables.
Se declaran con la palabra reservada record
y pueden contener propiedades,
métodos de acceso, y otros métodos personalizados.
Los registros también generan automáticamente implementaciones de métodos como equals()
,
hashCode()
y toString()
,
lo que ahorra tiempo y evita que escribamos código repetitivo.
El ejemplo más básico de un registro en Java es:
public record Producto(String nombre, String descripcion, float precio) { }
Puedes encontrar una explicación detallada en este articulo sobre registros en Java
Clases Abstractas
El uso de las clases abstractas no es tan común como los otros tipos de clases, pero son también una parte importante de Java. Estas clases te permiten definir métodos sin tener que implementarlos al nivel de la clase abstracta, sino más bien delegar esa responsabilidad a alguna clase concreta descendiente.
Dentro de estas clases también puedes crear e implementar métodos, como lo harías con una clase tradicional.
Aquí tienes un ejemplo de clase abstracta:
abstract class FiguraGeometrica {
// Campo para guardar el nombre/tipo de la figura
private final String tipoFigura;
// Constructor
public FiguraGeometrica(String tipoFigura) {
this.tipoFigura = tipoFigura;
}
// Método implementado tradicionalmente
public String getTipoFigura() {
return this.tipoFigura;
}
// Método abstracto
public abstract float calcularArea();
}
La responsabilidad de implementar el método calcularArea()
recae sobre las clases concretas que hereden de FiguraGeometrica
.
Para una explicación detallada de las clases abstractas, puedes leer este artículo sobre clases abstractas en Java