1. Pacotes

Programas Java comuns envolvem um número enorme de classes. Quantos? Milhares, dezenas de milhares. E se você também levar em conta o fato de que o programa usa várias bibliotecas contendo classes escritas por outros programadores, então o número de classes pode facilmente ser medido em milhões!

Seria praticamente impossível criar nomes únicos para todos esses milhões, ou mesmo apenas milhares, de classes.

Claro, podemos imaginar nomes como A123e B345, mas se estamos falando em escolher um bom nome de classe, um que facilite o entendimento da classe (como Stringpara strings, por exemplo), então mesmo gerar mil nomes únicos é muito de trabalho.

É por isso que em Java é comum agrupar classes em pacotes usando a palavra-chave package.

As classes Java e seus pacotes são muito semelhantes a arquivos e pastas em um computador.

Por exemplo, se você precisar armazenar 10 documentos em seu computador, provavelmente os manterá em uma pasta. Mas e se você tiver milhares de documentos (por exemplo, um repositório de todos os documentos de uma empresa)?

Com milhares de documentos a serem armazenados, uma solução é criar vários níveis de pastas com bons nomes descritivos. E então, em uma pasta no último nível, armazene os documentos relacionados a essa pasta específica. Bons nomes descritivos para os documentos também não atrapalham.

Na verdade, fazemos tudo isso para classes em Java.

Os arquivos contendo as classes são armazenados em diferentes diretórios (pastas), e o nome completo da pasta da classe com todas as suas subpastas é o nome do pacote. Exemplo:

Caminho para o arquivo Nome do pacote Nome da classe
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

Ao contrário dos nomes de pastas, os nomes de pacotes usam um ponto como delimitador. Em outras palavras, a pasta \com\codegym\tasks\corresponde ao com.codegym.taskspacote.


2. srcpasta

Em Java, costuma-se armazenar todas as classes de um programa em uma única pasta (e subpastas). Essa pasta geralmente é chamada src(abreviação de source ).

Essa pasta é chamada de raiz do projeto (ou raiz de origem ) e todos os caminhos de pacote são relativos a ela. Exemplos:

Pastas Nome do pacote
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

Nessa situação, os programadores dizem algo como "temos um projeto chamado my, que está localizado na c:\projects\datapasta" ou "temos um projeto chamado project, que está localizado na d:\files\git\datapasta"

É melhor sempre colocar as classes em pacotes e não diretamente na pasta raiz ( src. Se você tiver apenas algumas classes, isso não representa um problema. Mas quando há muitas classes, é muito fácil se confundir. Então , sempre crie suas classes apenas em packages.

Em Java, costuma-se dar nomes significativos a classes e pacotes. Muitas empresas lançam suas próprias bibliotecas (um conjunto de classes) e, para evitar confusão, incorporam o nome da empresa/site/projeto ao nome do pacote:

Nome do pacote Nome da empresa/projeto
org.apache.common
org.apache.tomcat
org.apache.util
Projeto Apache
com.oracle.jdbc
empresa Oracle
java.io
javax.servlet
Empresa Oracle, projeto Java
com.ibm.websphere
Empresa IBM, projeto WebSphere
com.jboss
Projeto JBoss

3. Conteúdo do arquivo

De acordo com o padrão da linguagem Java, informações sobre o nome de uma classe e o nome de seu pacote devem ser incluídas no arquivo com o código. A forma geral é mostrada abaixo:

package package-name;

public class ClassName
{

}

O nome do pacote deve corresponder ao nome da pasta e o nome do arquivo deve corresponder ao nome da classe pública.

Se você tiver um arquivo, ele deve conter isto:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Importando classes

O nome da classe e o nome do pacote formam o que é chamado de nome totalmente qualificado da classe .

Exemplos:

Nome totalmente qualificado Nome do pacote Nome da classe
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
nenhum
Cat

As boas notícias:

O nome de classe totalmente qualificado é sempre exclusivo em um projeto. Afinal, não dá para criar dois arquivos com o mesmo nome em uma única pasta.

As más notícias:

Nomes de classe totalmente qualificados são geralmente longos ou muito longos. E escrever um nome longo (por exemplo java.util.ArrayList) toda vez no código é super inconveniente.

É por isso que o Java adicionou a capacidade de importar classes .

Você pode usar o nome abreviado de uma classe em seu código, mas primeiro deve informar ao compilador qual nome de classe totalmente qualificado corresponde ao nome abreviado . E se você agora tiver várias classes com o mesmo nome em seu projeto? Ou você originalmente tem um, mas mais 15 foram adicionados...

Para usar um nome de classe curto em seu código, você precisa adicionar a seguinte construção:

import fully-qualified-class-name;

Essa declaração deve ser adicionada logo no início da aula, logo após a packagedeclaração.

Exemplo:

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 duas classes ( ejava.util.Scanner ) com.test.helper.special.ArrayList, para que possamos usar seus nomes curtos em nosso código. E o compilador saberá quais classes usar.

E aqui está como o mesmo código ficaria se não tivéssemos 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();
   }
}

A propósito, se seu projeto tiver duas classes chamadas Scanner, você não poderá importar as duas para o mesmo arquivo: terá que usar o nome longo para uma delas.

Digamos que você tenha uma Jen em sua equipe. Não há problemas de comunicação, pois todos sabem quem ela é. Mas se houvesse três Jens, nomes totalmente qualificados teriam que ser usados ​​para distingui-los.

Nota 1

A propósito, se você estiver com preguiça de adicionar muitas declarações de importação à sua classe, poderá usar sua versão preguiçosa: em vez de um nome de classe específico, coloque um asterisco:

import package-name.*;

Isso permitirá que você use os nomes curtos de todas as classes no pacote.

Nota 2

Todas as classes do java.langpacote são importadas automaticamente, então você não precisa escrever uma importinstrução para elas. Com certeza você já conhece uma dessas aulas: java.lang.String. Sim está certo. Esta é a Stringclasse que usamos para trabalhar com strings.