1. Пакети
У стандартних Java-програмах дуже багато класів. Скільки? Тисячі, десятки тисяч. А якщо врахувати ще використання програмою різних бібліотек, які містять класи, написані іншими програмістами, то кількість класів легко може сягнути мільйонів!
Для всіх цих мільйонів, та й для тисяч класів неможливо придумати унікальні імена.
Ні, звісно, можна створити імена на кшталт А123
, Б345
, але якщо ми говоримо про вибір для кожного класу гарного імені, що сприятиме розумінню цього класу (як-от String
для рядків, приміром), то навіть тисяча унікальних імен — це велика праця.
Тому в Java всі класи згруповано в пакети.
Класи та їх пакети в Java за своєю сутністю дуже нагадують файли і папки на комп'ютері.
Наприклад, якщо вам потрібно зберігати на комп'ютері 10 документів, ви, найімовірніше, просто зберігатимете їх в одній папці. А якщо документів тисячі (наприклад, сховище всіх документів компанії)?
Коли потрібно зберігати тисячі документів, можна створити кілька рівнів папок з гарними промовистими назвами. І в папці останнього, найнижчого, рівня зберігати документи, що стосуються цієї конкретної папки. Хороші промовисті назви документів теж не завадять.
На практиці в Java це все й було зроблено для класів.
Файли з класами зберігаються в різних директоріях (папках), і повна назва папки класу з усіма підпапками називається пакетом класу. Приклад:
Шлях до файлу | Ім’я пакету | Ім’я класу |
---|---|---|
|
|
|
|
|
|
|
|
|
Ім'я пакету, на відміну від імені папки, пишеться через крапку. Тобто якщо папка була \com\javarush\tasks\
, їй відповідатиме пакет com.javarush.tasks
.
2. Папка src
У Java прийнято всі класи однієї програми зберігати в одній папці (та її підпапках). Такій папці зазвичай дають ім'я src
(скорочення від source).
Така папка називається коренем проєкту (source root), і всі шляхи для пакетів починають відлік від неї. Приклади:
Папки | Ім’я пакету |
---|---|
|
|
|
|
Програмісти в такій ситуації скажуть щось на кшталт: «У нас є проєкт на ім'я my
, розміщений у папці c:\projects\data
» або «У нас є проєкт на ім'я project
, розміщений у папці d:\files\git\data
».
Краще завжди вкладати класи в пакети, а не в кореневу папку src
проєкту. Коли класів мало, це не є проблемою, але коли класів багато, дуже легко заплутатися. Тому завжди створюйте класи лише в пакетах.
У Java прийнято давати класам і пакетам осмислені імена. Багато компаній випускають свої бібліотеки (набір класів) і, щоб уникнути плутанини, називають пакети цих класів за іменем компанії/сайту/проєкту:
Ім’я пакету | Ім'я компанії/проєкту |
---|---|
|
Проєкт «Apache» |
|
Компанія Oracle |
|
Компанія Oracle, проєкт Java |
|
Компанія IBM, проєкт WebSphere |
|
Проєкт «Jboss» |
3. Вміст файлу:
Відповідно до стандарту мови Java, всередині файлу з кодом має бути записана інформація про ім'я класу та ім'я його пакету. Схему стандарту наведено нижче:
package ім'я-пакету;
public class Ім'я-класу
{
}
Ім'я пакету має збігатися з іменем папки, а ім'я файлу — з іменем публічного класу.
Якщо у вас є файл ...\src\com\project\Service.java
, то в ньому має бути записано:
package com.project;
public class Service
{
}
4. Імпортування класів
Ім'я класу + ім'я пакету утворюють так зване повне унікальне ім'я класу.
Приклади:
Повне унікальне ім'я | Ім’я пакету | Ім’я класу |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
немає |
|
Добра новина:
Повне ім'я класу завжди є унікальним у межах одного проєкту. Адже ви не можете створити в одній папці два файли з однаковими іменами.
Погана новина:
Повні імена класів зазвичай або довгі, або дуже довгі. Але щоразу писати в коді довге ім'я, наприклад java.util.ArrayList, дуже незручно.
Тому в Java додали можливість «імпортувати класи».
Ви можете використовувати в своєму коді коротке ім'я класу, але спочатку потрібно пояснити компілятору, яке саме «повне унікальне ім'я класу» відповідає короткому імені. Адже, можливо, у вашому проєкті декілька класів з таким іменем. Або спочатку був один, а потім додалося ще 15…
Щоб використовувати у своєму коді коротке ім'я класу, вам слід додати в код отаку конструкцію:
import повне-унікальне-ім'я-класу;
Додавати таке оголошення потрібно напочатку класу відразу після оголошення package
.
Приклад:
package com.javarush.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();
}
}
Завдяки тому, що ми імпортували два класи, java.util.Scanner
і com.test.helper.special.ArrayList
, можна використовувати їхні короткі імена в нашому коді. І компілятор знатиме, про які саме класи йдеться.
А от який вигляд мав би цей самий код, якби ми не використовували import
:
package com.javarush.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();
}
}
До речі, якщо у вашому проєкті є два класи з іменем Scanner
, імпортувати їх обидва в один файл із кодом не вийде: для другого постійно доведеться використовувати довге ім'я.
Припустімо, у вашому колективі є Павло і ніяких проблем зі спілкуванням не виникає — всі знають, хто це. Але якби їх було троє, щоб їх розрізняти, довелося б використовувати повні унікальні імена.
До речі, якщо вам ліньки додавати багато імпортів у свій код, можна скористатися версією імпортування для ледачих — замість імені класу поставити зірочку:
import ім'я-пакету.*;
У такому разі ви зможете використовувати в коді короткі імена всіх класів із цього пакету.
Усі класи з пакету java.lang
імпортуються автоматично, тому немає потреби писати для них import
. Один такий клас ви точно знаєте: це клас… java.lang.String
. Так-так, той самий клас String
, який використовують для роботи з рядками.