1. Пакети
У стандартних Java-програмах дуже багато класів. Скільки? Тисячі, десятки тисяч. А якщо ще врахувати, що програма використовує різні бібліотеки, які містять класи, написані іншими програмістами, то кількість класів легко може обчислюватись мільйонами!
Для всіх цих мільйонів, та й просто тисяч класів неможливо придумати унікальні імена.
Ні, ну звісно можна придумати імена типу А123, Б345, але якщо ми говоримо про вибір для кожного класу гарного імені, яке полегшує розуміння цього класу (як String для рядків, наприклад), то навіть тисяча унікальних імен — це велика праця.
Тому в Java всі класи згруповані по пакетах.
Класи і їх пакети в Java по своїй суті дуже нагадують файли і папки на комп'ютері.
Наприклад, якщо вам потрібно зберігати на комп'ютері 10 документів, ви скоріше за все просто будете зберігати їх в одній папці. А якщо документів тисячі (наприклад, сховище всіх документів компанії)?
Якщо б потрібно було зберігати тисячі документів, рішенням було б розробити кілька рівнів папок з гарними зрозумілими назвами. І в папці останнього рівня зберігати документи, які стосуються цієї конкретної папки. Гарні зрозумілі назви для документів теж не завадять.
Фактично в Java це все і було зроблено для класів.
Файли з класами зберігаються в різних директоріях (папках), і повна назва папки класу з усіма підпапками називається пакетом класу. Приклад:
| Шлях до файлу | Ім'я пакету | Ім'я класу |
|---|---|---|
|
|
|
|
|
|
|
|
|
Ім'я пакету, на відміну від імені папки, пишеться через крапку. Тобто, якщо папка була \com\codegym\tasks\, їй буде відповідати пакет com.codegym.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.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();
}
}
Завдяки тому, що ми імпортували два класи java.util.Scanner і com.test.helper.special.ArrayList, ми можемо використовувати їх короткі імена в нашому коді. І компілятор буде знати, які саме класи використовувати.
А ось як би виглядав цей же код, якщо б ми не використовували 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();
}
}
До речі, якщо у вас в проєкті є два класи з ім’ям Scanner, імпортувати їх обидва в один файл із кодом не вийде: для другого постійно доведеться використовувати довге ім’я.
Допустимо, у вас в колективі є Сергій, і ніяких проблем із комунікацією не виникає — всі знають хто це. Але якщо їх було б троє, щоб їх розрізняти, довелося б використовувати повні унікальні імена.
До речі, якщо вам ліньки додавати багато імпортів у ваш клас, ви можете скористатись його версією для лінивих: замість імені класу поставити зірочку:
import ім'я-пакету.*;
Таким чином, ви зможете використовувати в вашому коді короткі імена всіх класів із цього пакету.
Усі класи з пакету java.lang імпортуються автоматично, тому вам не потрібно писати для них import. Один такий клас ви точно знаєте: це клас... java.lang.String. Так, так, той самий клас String, який використовується для роботи з рядками.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ