1. Paquetes

Los programas ordinarios de Java involucran una enorme cantidad de clases. ¿Cuántos? Miles, decenas de miles. Y si también tiene en cuenta el hecho de que el programa utiliza varias bibliotecas que contienen clases escritas por otros programadores, ¡entonces el número de clases se puede medir fácilmente en millones!

Sería casi imposible encontrar nombres únicos para todos estos millones, o incluso miles, de clases.

Por supuesto, podemos imaginar nombres como A123y B345, pero si estamos hablando de elegir un buen nombre de clase, uno que facilite la comprensión de la clase (como Stringcadenas, por ejemplo), incluso generar mil nombres únicos es mucho de trabajo.

Es por eso que en Java se acostumbra agrupar las clases en paquetes usando la palabra clave del paquete.

Las clases de Java y sus paquetes son muy similares a los archivos y carpetas de una computadora.

Por ejemplo, si necesita almacenar 10 documentos en su computadora, probablemente los guarde en una sola carpeta. Pero, ¿qué sucede si tiene miles de documentos (por ejemplo, un repositorio de todos los documentos de una empresa)?

Con miles de documentos para almacenar, una solución es crear múltiples niveles de carpetas con buenos nombres descriptivos. Y luego, en una carpeta en el último nivel, almacene los documentos relacionados con esa carpeta en particular. Buenos nombres descriptivos para los documentos tampoco hacen daño.

De hecho, hacemos todo esto para las clases en Java.

Los archivos que contienen las clases se almacenan en diferentes directorios (carpetas), y el nombre completo de la carpeta de la clase con todas sus subcarpetas es el nombre del paquete. Ejemplo:

Ruta al archivo Nombre del paquete Nombre de la clase
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

A diferencia de los nombres de las carpetas, los nombres de los paquetes usan un punto como delimitador. En otras palabras, la carpeta \com\codegym\tasks\corresponde al com.codegym.taskspaquete.


2. srccarpeta

En Java, se acostumbra almacenar todas las clases de un programa en una sola carpeta (y subcarpetas). Esta carpeta generalmente se llama src(abreviatura de fuente ).

Esta carpeta se denomina raíz del proyecto (o raíz de origen ) y todas las rutas de los paquetes son relativas a ella. Ejemplos:

Carpetas Nombre del paquete
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

En esta situación, los programadores dicen algo como "tenemos un proyecto llamado my, que está ubicado en la c:\projects\datacarpeta" o "tenemos un proyecto llamado project, que está ubicado en la d:\files\git\datacarpeta" .

Lo mejor es poner siempre las clases en paquetes y no directamente en la carpeta raíz ( src. Si solo tiene unas pocas clases, esto no presenta ningún problema. Pero cuando hay muchas clases, es muy fácil confundirse. Entonces , crea siempre tus clases solo en paquetes.

En Java, se acostumbra dar nombres significativos a clases y paquetes. Muchas empresas lanzan sus propias bibliotecas (un conjunto de clases) y, para evitar confusiones, incorporan el nombre de la empresa/sitio web/proyecto en el nombre del paquete:

Nombre del paquete Nombre de la empresa/proyecto
org.apache.common
org.apache.tomcat
org.apache.util
proyecto apache
com.oracle.jdbc
empresa oracle
java.io
javax.servlet
empresa Oracle, proyecto Java
com.ibm.websphere
empresa IBM, proyecto WebSphere
com.jboss
Proyecto JBoss

3. Contenido del archivo

De acuerdo con el estándar del lenguaje Java, la información sobre el nombre de una clase y el nombre de su paquete debe incluirse en el archivo con el código. La forma general se muestra a continuación:

package package-name;

public class ClassName
{

}

El nombre del paquete debe coincidir con el nombre de la carpeta y el nombre del archivo debe coincidir con el nombre de la clase pública.

Si tiene un archivo, debe contener esto:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Clases de importación

El nombre de la clase y el nombre del paquete forman lo que se denomina el nombre completo de la clase .

Ejemplos:

Nombre completamente calificado Nombre del paquete Nombre de la clase
java.io.FileInputStream
java.io
FileInputStream
java.lang.String
java.lang
String
java.util.ArrayList
java.util
ArrayList
org.apache.tomcat.Servlet
org.apache.tomcat
Servlet
Cat
ninguno
Cat

Las buenas noticias:

El nombre de clase totalmente calificado siempre es único dentro de un proyecto. Después de todo, no puede crear dos archivos con el mismo nombre en una sola carpeta.

Las malas noticias:

Los nombres de clase completos suelen ser largos o muy largos. Y escribir un nombre largo (por ejemplo, java.util.ArrayList) cada vez en el código es muy inconveniente.

Es por eso que Java agregó la capacidad de importar clases .

Puede usar el nombre corto de una clase en su código, pero primero debe informar al compilador qué nombre de clase completamente calificado corresponde al nombre corto . ¿Qué sucede si ahora tiene varias clases con el mismo nombre en su proyecto? O originalmente tiene uno, pero luego se agregaron 15 más...

Para usar un nombre de clase corto en su código, debe agregar la siguiente construcción:

import fully-qualified-class-name;

Esta declaración debe agregarse al principio de la clase, justo después de la packagedeclaración.

Ejemplo:

package com.codegym.tasks.task01;

import java.util.Scanner;
import com.test.helper.special.ArrayList;

public class Solution
{
   public static void main(String[] args)
   {
     Scanner console = new Scanner(System.in);
     ArrayList list = new ArrayList();
   }
}

Importamos dos clases ( y ), por lo que podemos usar sus nombres cortos en nuestro código. Y el compilador sabrá qué clases usar.java.util.Scannercom.test.helper.special.ArrayList

Y así es como se vería el mismo código si no lo hubiéramos usado import:

package com.codegym.tasks.task01;

public class Solution
{
   public static void main(String[] args)
   {
     java.util.Scanner console = new java.util.Scanner(System.in);
     com.test.helper.special.ArrayList list = new com.test.helper.special.ArrayList();
   }
}

Por cierto, si su proyecto tiene dos clases con el nombre Scanner, no podrá importarlas al mismo archivo: tendrá que usar el nombre largo para una de ellas.

Digamos que tienes a Jen en tu equipo. No hay problemas de comunicación, ya que todo el mundo sabe quién es ella. Pero si hubiera tres Jens, entonces tendrían que usarse nombres completamente calificados para distinguirlos.

Nota 1

Por cierto, si es demasiado perezoso para agregar muchas declaraciones de importación a su clase, puede usar su versión perezosa: en lugar de un nombre de clase específico, coloque un asterisco:

import package-name.*;

Eso le permitirá usar los nombres cortos de todas las clases en el paquete.

Nota 2

Todas las clases del java.langpaquete se importan automáticamente, por lo que no necesita escribir una importdeclaración para ellas. Seguro que ya conoces alguna de estas clases: java.lang.String. Sí, eso es correcto. Esta es la Stringclase que hemos usado para trabajar con cadenas.