No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso Avanzado de Java SE

Curso Avanzado de Java SE

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Implementando una clase anidada al proyecto

13/40
Recursos

¿Cómo crear una clase anidada en Java para un proyecto de libro virtual?

Parece que estás interesado en aprender a programar una simulación de libro en Java que refleja cómo se leen los libros reales, página por página. En este contenido, te guiaremos a través de la creación de una clase anidada denominada 'Page' dentro de una clase exterior llamada 'Book'. Este enfoque no solo proporciona una representación más precisa de la lectura de libros, sino que también añade valor a tu proyecto de simulación.

¿Qué es una clase anidada y cuándo usarla?

Las clases anidadas son clases definidas dentro de otras clases. Son útiles cuando se desea crear una relación lógica que refuerce el encapsulamiento y la organización del código. Las clases estáticas son ideales cuando no es necesario acceder a los métodos o elementos de la clase exterior.

¿Cómo implementar una clase anidada 'Page'?

Para simular una página de libro, empezamos creando una clase estática anidada dentro de la clase 'Book'. Esto es porque no necesitamos acceder a métodos específicos de 'Book'. A continuación, presentamos un ejemplo de cómo configurar esta clase:

public class Book {
    // Otros métodos y atributos de Book aquí

    public static class Page {
        // Atributos de la clase Page
        private int number;  // número de página
        private String content; // contenido de la página

        // Constructor para inicializar una página
        public Page(int number, String content) {
            this.number = number;
            this.content = content;
        }

        // Getters y setters para modificar y acceder a las propiedades
        public int getNumber() {
            return number;
        }

        public void setNumber(int number) {
            this.number = number;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }
    }
}

¿Cómo añadir atributos y funcionalidad a la clase 'Page'?

Para enriquecer la clase 'Page', hemos incorporado atributos básicos como el número de página y el contenido de texto. Además, implementamos getters y setters para estos atributos, y un constructor para poder inicializar cada página con sus propiedades:

  • number: Almacena el número de la página.
  • content: Almacena el texto, o potencialmente otros tipos de contenido como imágenes.

Estos componentes básicos mejoran la capacidad de simular el cambio de página, elemento a elemento, como en un libro físico.

¿Cuáles son los siguientes pasos para desarrollar la simulación de lectura?

Ahora que hemos definido la estructura básica de la clase 'Page', el siguiente paso en tu desarrollo es codificar la experiencia interactiva del lector. Aquí hay algunas características potenciales a considerar:

  • Cambio de página: Utiliza eventos de teclado para simular el paso a la siguiente página o la reversa a una anterior.
  • Control de flujo: Permite al usuario cerrar el libro y regresar al menú inicial.
  • Interfaz atractiva: Aunque trabajamos en la consola, considera implementar mejoras visuales para una mejor experiencia del usuario.

¡Continúa tu viaje de aprendizaje en Java! Cada pequeño paso te acerca a la maestría en programación.

Aportes 19

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Se utilizan las clases inner cuando quieres tener acceso a algun medodo de la clas exterior

Se utilizan las clases abstractas cuando no necesariamente quieres tener acceso a los metodos de la clase exterior

Pregunta como se haría una clase anidada en un diagrama de UML de clases.

muy buena clase y excelente explicación!!!

Vamos a trabajar.!!

Esta es mi versión de la definición de la clase anidada Page.

Page

import com.erosennin.amazonviewer.utils.Utils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class Book extends Publication implements Visualizable {

    private int id;
    private String isbn;
    private int pages;
    private Date startDate;

    public Book(String title, String editorial, String[] authors, Date publicationDate, String isbn, boolean readed, int pages) {
        super(title, editorial, authors, publicationDate);
        super.setReaded(readed);
        this.isbn = isbn;
        this.pages = pages;
    }

    public int getId() {
        return id;
    }

    public String getIsbn() {
        return isbn;
    }

    public int getPages() {
        return pages;
    }

    public static List<Book> makeBooksList() {
        List<Book> books = new ArrayList<>();
        for (int i = 1; i < 6; i++) {
            books.add(new Book("Book " + i, "Editorial " + i, new String[]{"Author " + i}, new Date(),
                    "ISBN " + i, false, 200 + i));
        }
        return books;
    }

    public void view() {
        setReaded(true);
        startToSee(new Date());
        for (int i = 0; i < 100; i++) {
            System.out.println("...You are reading the " + getTitle() + "...");
        }
        Utils.timeDelay(2);
        stopToSee(new Date());
        System.out.println("\n::YOU JUST SAW::" + toString());
    }

    @Override
    public String toString() {
        StringBuilder printerAuthors = new StringBuilder();
        String[] authors = getAuthors();
        for (String author : authors) {
            printerAuthors.append(author).append(", ");
        }
        printerAuthors.delete(printerAuthors.length() - 2, printerAuthors.length() - 1);
        return "\n::BOOK::" +
                "\nTitle: " + getTitle() +
                "\nPublisher: " + getEditorial() +
                "\nAuthors: " + printerAuthors +
                "\nPublication Date: " + new SimpleDateFormat("dd/MM/yyyy").format(getPublicationDate()) +
                "\nISBN: " + getIsbn() +
                "\nReaded: " + isReaded() +
                "\nPages: " + getPages();
    }

    @Override
    public void startToSee(Date startDate) {
        this.startDate = startDate;
    }

    @Override
    public void stopToSee(Date endDate) {
        if (startDate.getTime() < endDate.getTime()) {
            setTimeReaded((int) (endDate.getTime() - startDate.getTime()));
        } else {
            setTimeReaded(0);
        }
    }


    public static class Page {

        private int id;
        private int number;
        private String content;

        public Page(int number, String content) {
            this.number = number;
            this.content = content;
        }

        public int getNumber() {
            return number;
        }

        public String getContent() {
            return content;
        }
    }
}

si en buen punto las clases anidadas como se representan en UML

muy buena claseee!!!

Que buena clase, un ejemplo muy bueno

Me parece que ya viene lo más emocionante 😄

un ejemplo muy bueno de aplicacion, quedo claro el tema.

Las clases anidadas son un buen uso cuando queremos usar objetos auxiliares

Muy buen ejemplo, algo que me pareció importante fue lo de Inner y Static:

Utilizamos Inner Class cuando queremos tener acceso a algún método en donde estamos y Static Class no necesariamente queremos tener acceso a los métodos en este caso de Book.

Excelente clase buena practica

Muy buena implementación, muy interesante esta nueva herramienta

Las clases anidadas son una representación de la relación Composición?

Super 😃

/**
 * Clase Interior Page
 * */
public static class Page { }

Genial.

Excelente clase, ahora me quedo más clara la diferencia entre las clases static y las clases inner respecto al uso de métodos de la clase externa.

Entonces existen clases que hacen parte de otras, que su definición esta en la definición de otra clase (por eso el aninadadas)

¿En qué se diferenciaría con qué una clase tenga como atributo a otra clase? ¿En qué casos es mejor una u otra?

Tengo entendido que es cuándo nadie más hará uso de ella, pero ¿Trae más ventajas?