¡Bienvenido a la lección de hoy! Nos adentraremos en cuatro conceptos poderosos en Java: ArrayList, interfaces, clases abstractas y BigDecimal. Estas herramientas son como las navajas suizas de la programación en Java: versátiles, eficientes y esenciales para cualquier desarrollador serio.
Imagina que estás organizando una caja de herramientas. ArrayList es como un compartimento expansible que puede contener cualquier tipo de herramienta. Las interfaces son como los planos para herramientas especializadas. Las clases abstractas son herramientas parcialmente construidas que puedes personalizar. ¿Y BigDecimal? Es la cinta métrica de precisión cuando necesitas medidas exactas hasta la fracción más pequeña.
Estos conceptos te ayudan a:
- Crear colecciones de datos flexibles y dinámicas (ArrayList)
- Diseñar contratos claros que las clases deben seguir (interfaces)
- Compartir código entre clases relacionadas permitiendo la personalización (clases abstractas)
- Realizar cálculos decimales precisos sin errores de redondeo (BigDecimal)
- ArrayList: Un array redimensionable que puede crecer o reducirse según sea necesario.
- Interfaces: Un contrato que especifica qué métodos debe implementar una clase.
- Clases Abstractas: Una implementación parcial de una clase que no puede instanciarse por sí sola.
- BigDecimal: Una clase para realizar aritmética decimal precisa.
Exploremos cada uno en detalle.
ArrayList es una implementación de array dinámico en Java. Te permite almacenar y manipular una colección de objetos.
Sintaxis:
ArrayList<Type> listName = new ArrayList<>();Ejemplo:
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
System.out.println(fruits.get(0)); // Salida: AppleUna interfaz define un contrato de métodos que las clases que la implementen deben proporcionar. Establece un acuerdo sobre lo que una clase debe hacer, pero no cómo lo hace. Una clase puede implementar múltiples interfaces, lo que permite una forma de herencia múltiple
Sintaxis:
public interface InterfaceName {
returnType methodName(parameters);
}Ejemplo:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Dibujando un círculo");
}
}Las clases abstractas proporcionan una implementación parcial y no pueden instanciarse directamente. Puede tener métodos concretos y abstractos, así como variables y constructores. Una subclase debe implementar todos los métodos abstractos de la clase abstracta, o también debe ser abstracta.
Sintaxis:
public abstract class AbstractClassName {
// Métodos concretos
public void concreteMethod() {
// Implementación
}
// Métodos abstractos
public abstract void abstractMethod();
}Ejemplo:
public abstract class Shape {
public abstract double area();
public void displayArea() {
System.out.println("Área: " + area());
}
}
public class Square extends Shape {
private double side;
public Square(double side) {
this.side = side;
}
@Override
public double area() {
return side * side;
}
}BigDecimal se utiliza para aritmética decimal precisa, especialmente importante en cálculos financieros.
Sintaxis:
BigDecimal number = new BigDecimal("number");Ejemplo:
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal sum = a.add(b);
BigDecimal displayVal = sum.setScale(2, RoundingMode.HALF_EVEN);
System.out.println(displayVal);- ArrayList no es seguro para hilos. Usa Vector o Collections.synchronizedList() para operaciones seguras en hilos.
- Las interfaces pueden tener métodos por defecto y estáticos desde Java 8.
- Las clases abstractas pueden tener tanto métodos abstractos como concretos.
- Siempre utiliza el constructor de String para BigDecimal para evitar problemas de precisión.
- Crea una interfaz
Downloadablecon el métododownload(). - Crea una interfaz
Purchasablecon el métodopurchase(). - Crea una clase abstracta
AbstractProductque implementePurchasable. - Crea dos clases concretas
BookyElectronicsque extiendanAbstractProduct. La claseBooktambién debe implementarDownloadable. - Usa un ArrayList para almacenar los artículos del carrito y BigDecimal para los precios.
import java.math.BigDecimal;
import java.util.ArrayList;
public class classExercise.ShoppingCartSystemWithoutShoppingCartClass {
public static void main(String[] args) {
// TODO: Implementar el sistema de carrito de compras aquí
// 1. Crear la interfaz Downloadable
// 2. Crear la interfaz Purchasable
// 3. Crear la clase AbstractProduct
// 4. Crear las clases Book y Electronics
// 5. Crear un ArrayList para almacenar los artículos del carrito
// 6. Agregar algunos productos al carrito
// 7. Calcular y mostrar el precio total
}
}- Implementa un sistema de descuentos usando BigDecimal.
- Añade un método para eliminar artículos del carrito.
- Implementa lógica adicional en la clase
Bookpara simular la descarga de contenido cuando se llama al métododownload().
Recuerda usar un manejo de excepciones adecuado al trabajar con la aritmética de BigDecimal. ¡Buena suerte!
-
Interfaz
Downloadable:- Métodos:
download(): Simula la acción de descargar contenido, que será implementada en la claseBook.
- Métodos:
-
Interfaz
Purchasable:- Métodos:
purchase(): Simula la acción de comprar un producto, implementado en todas las clases de productos.
- Métodos:
-
Clase
AbstractProduct:- Implementa la interfaz
Purchasable. - Incluye atributos como
nameyprice, y proporciona la implementación del métodopurchase()que maneja la lógica común para la compra de cualquier producto.
- Implementa la interfaz
-
Clases
BookyElectronics:Bookimplementa tantoPurchasablecomoDownloadable. Su métododownload()simula la descarga de un libro.Electronicsimplementa únicamentePurchasable.
-
ArrayList:
- Se utilizará para almacenar instancias de productos en el carrito, permitiendo realizar operaciones como la suma del precio total.
Esta lección se basa en tu conocimiento previo de clases y objetos, mientras introduce conceptos más avanzados que serán cruciales para construir aplicaciones Java más grandes y complejas. En lecciones futuras, exploraremos cómo se utilizan estos conceptos en escenarios del mundo real y profundizaremos en los patrones de diseño que utilizan interfaces y clases abstractas.