JavaRush /Курси /Java Syntax Zero /Проекти в Java

Проекти в Java

Java Syntax Zero
Рівень 9 , Лекція 3
Відкрита

1. Пакети

У стандартних Java-програмах дуже багато класів. Скільки? Тисячі, десятки тисяч. А якщо ще врахувати, що програма використовує різні бібліотеки, які містять класи, написані іншими програмістами, то кількість класів легко може обчислюватись мільйонами!

Для всіх цих мільйонів, та й просто тисяч класів неможливо придумати унікальні імена.

Ні, ну звісно можна придумати імена типу А123, Б345, але якщо ми говоримо про вибір для кожного класу гарного імені, яке полегшує розуміння цього класу (як String для рядків, наприклад), то навіть тисяча унікальних імен — це велика праця.

Тому в Java всі класи згруповані по пакетах.

Класи і їх пакети в Java по своїй суті дуже нагадують файли і папки на комп'ютері.

Наприклад, якщо вам потрібно зберігати на комп'ютері 10 документів, ви скоріше за все просто будете зберігати їх в одній папці. А якщо документів тисячі (наприклад, сховище всіх документів компанії)?

Якщо б потрібно було зберігати тисячі документів, рішенням було б розробити кілька рівнів папок з гарними зрозумілими назвами. І в папці останнього рівня зберігати документи, які стосуються цієї конкретної папки. Гарні зрозумілі назви для документів теж не завадять.

Фактично в Java це все і було зроблено для класів.

Файли з класами зберігаються в різних директоріях (папках), і повна назва папки класу з усіма підпапками називається пакетом класу. Приклад:

Шлях до файлу Ім'я пакету Ім'я класу
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

Ім'я пакету, на відміну від імені папки, пишеться через крапку. Тобто, якщо папка була \com\codegym\tasks\, їй буде відповідати пакет com.codegym.tasks.


2. Папка src

У Java прийнято всі класи однієї програми зберігати в одній папці (та її підпапках). Таку папку зазвичай називають src (скорочення від source).

Така папка називається коренем проєкту (source root), і всі шляхи для пакетів обчислюються від неї. Приклади:

Папки Ім'я пакету
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

Програмісти в такій ситуації скажуть щось типу «у нас є проєкт під назвою my, який розташований у папці c:\projects\data» або «у нас є проєкт під назвою project, який розташований у папці d:\files\git\data»

Краще завжди класти класи у пакети, а не в корінь папки src. Коли класів мало, це ще не проблема, але коли класів багато, дуже легко заплутатись. Тому завжди створюйте класи тільки в пакетах.

У Java прийнято давати класам і пакетам осмислені імена. Багато компаній випускають свої бібліотеки (набір класів) і, щоб не було плутанини, називають пакети цих класів за назвою компанії/сайту/проєкту:

Ім'я пакету Ім'я компанії/проєкту
org.apache.common
org.apache.tomcat
org.apache.util
Проєкт «Apache»
com.oracle.jdbc
Компанія «Oracle»
java.io
javax.servlet
Компанія Oracle, проєкт Java
com.ibm.websphere
Компанія «IBM», проєкт WebSphere
com.jboss
Проєкт «Jboss»

3. Вміст файлу

Згідно стандарту мови Java, всередині файлу з кодом має бути записана інформація про ім’я класу й ім’я його пакета. Схема стандарту наведена нижче:

package ім'я-пакету;

public class Ім'я-класу
{

}

Ім’я пакету має збігатися з іменем папки, а ім’я файлу — з іменем публічного класу.

Якщо у вас є файл ...\src\com\project\Service.java, значить у нього всередині має бути записано:

package com.project;

public class Service
{

}

4. Імпорт класів

Ім’я класу + ім’я пакету формують так зване повне унікальне ім’я класу.

Приклади:

Повне унікальне ім’я Ім’я пакету Ім’я класу
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
відсутній
Cat

Гарна новина:

Повне ім’я класу завжди унікальне в рамках одного проєкту. Ну ви ж не можете створити два файли з одним і тим же ім’ям в одній і тій же папці.

Погана новина:

Повні імена класів зазвичай або довгі, або дуже довгі. А ось кожного разу писати в коді довге ім’я, наприклад 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, імпортувати їх обидва в один файл із кодом не вийде: для другого постійно доведеться використовувати довге ім’я.

Допустимо, у вас в колективі є Сергій, і ніяких проблем із комунікацією не виникає — всі знають хто це. Але якщо їх було б троє, щоб їх розрізняти, довелося б використовувати повні унікальні імена.

Примітка 1

До речі, якщо вам ліньки додавати багато імпортів у ваш клас, ви можете скористатись його версією для лінивих: замість імені класу поставити зірочку:

import ім'я-пакету.*;

Таким чином, ви зможете використовувати в вашому коді короткі імена всіх класів із цього пакету.

Примітка 2

Усі класи з пакету java.lang імпортуються автоматично, тому вам не потрібно писати для них import. Один такий клас ви точно знаєте: це клас... java.lang.String. Так, так, той самий клас String, який використовується для роботи з рядками.


Коментарі (9)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Artem Рівень 26
24 січня 2024
Перекличка по воїнах JAVA!
gummer Рівень 11
4 березня 2024
Тут 🙃
Гаркін Рівень 14
11 березня 2024
+1
Ва Дим Рівень 28
24 березня 2024
😎
Anton Makho Рівень 16
15 серпня 2024
here)
hidden #3500645 Рівень 30
23 жовтня 2024
тут 😺
Anonymous #3425794 Рівень 11
10 грудня 2024
Тут 🤠
Roma Chernesh Рівень 16
22 грудня 2022
Ознака того, що все зрозуміло по темі: Ані одного коментаря/питання ні до задач, ні до статті:)
Василь Рівень 4
30 липня 2023
враховуючи статистику: "Цю задачу вирішила така *** кількість людей" нас з кожним днем стає все менше і менше