Ръководство за Java пакети

1. Въведение

В този бърз урок ще разгледаме основите на пакетите в Java. Ще видим как да създадем пакети и да получим достъп до типовете, които поставяме вътре в тях.

Също така ще обсъдим конвенциите за именуване и как това е свързано с основната структура на директориите.

Накрая ще компилираме и стартираме нашите пакетирани Java класове.

2. Преглед на Java пакетите

В Java използваме пакети за групиране на свързани класове, интерфейси и подпакети .

Основните ползи от това са:

  • Улесняване на намирането на свързани типове - пакетите обикновено съдържат типове, които са логически свързани
  • Избягване на конфликти при именуване - пакет ще ни помогне да идентифицираме уникално клас; например, бихме могли да имаме com.baeldung.Application, както и com.example.Application класове
  • Контролиране на достъпа - можем да контролираме видимостта и достъпа до типове, като комбинираме пакети и модификатори на достъпа

След това нека видим как можем да създаваме и използваме Java пакети.

3. Създаване на пакет

За да създадем пакет, трябва да използваме изявлението на пакета , като го добавим като първия ред на код във файл .

Нека поставим тип в пакет с име com.baeldung.packages :

package com.baeldung.packages;

Силно се препоръчва да поставите всеки нов тип в пакет. Ако дефинираме типове и не ги поставим в пакет, те ще отидат в пакета по подразбиране или без име. Използването на пакети по подразбиране има няколко недостатъка:

  • Губим предимствата от наличието на структура на пакета и не можем да имаме подпакети
  • Не можем да импортираме типовете в пакета по подразбиране от други пакети
  • Най- защитени и пакет-частни обхват за достъп ще бъдат безсмислени

Както посочва спецификацията на езика Java, неназовани пакети се предоставят от платформата Java SE главно за удобство при разработване на малки или временни приложения или когато тепърва започва разработването.

Затова трябва да избягваме използването на неназовани или пакети по подразбиране в реални приложения .

3.1. Конвенции за имената

За да избегнем пакети със същото име, следваме някои конвенции за именуване:

  • ние определяме имената на нашите пакети с малки букви
  • имената на пакетите са разграничени с период
  • имената също се определят от компанията или организацията, която ги създава

За да определим името на пакета въз основа на организация, обикновено започваме с обръщане на URL адреса на компанията. След това конвенцията за именуване се определя от компанията и може да включва имена на подразделения и имена на проекти.

Например, за да направим пакет от www.baeldung.com , нека го обърнем:

com.baeldung

След това можем допълнително да дефинираме подпакети от това, като com.baeldung.packages или com.baeldung.packages.domain.

3.2. Структура на директорията

Пакетите в Java съответстват на структурата на директории.

Всеки пакет и подпакет имат своя собствена директория. И така, за пакета com.baeldung.packages трябва да имаме структура на директории на com -> baeldung -> пакети .

Повечето IDE ще помогнат при създаването на тази структура на директории въз основа на имената на нашите пакети, така че не е нужно да ги създаваме на ръка.

4. Използване на членовете на пакета

Нека започнем с дефиниране на клас TodoItem в подпакет с име домейн :

package com.baeldung.packages.domain; public class TodoItem { private Long id; private String description; // standard getters and setters }

4.1. Внос

За да използваме нашия клас TodoItem от клас в друг пакет, трябва да го импортираме. След като бъде импортиран, можем да получим достъп до него по име.

Можем да импортираме един тип от пакет или да използваме звездичка, за да импортираме всички типове в пакет.

Нека импортираме целия подпакет на домейна :

import com.baeldung.packages.domain.*;

Сега нека импортираме само класа TodoItem :

import com.baeldung.packages.domain.TodoItem;

Библиотеките JDK и други Java също се предлагат със собствени пакети. Можем да импортираме вече съществуващи класове, които искаме да използваме в нашия проект по същия начин.

Например, нека импортираме интерфейса на Java Core List и клас ArrayList :

import java.util.ArrayList;import java.util.List;

След това можем да използваме тези типове в нашето приложение, като просто използваме името им:

public class TodoList { private List todoItems; public void addTodoItem(TodoItem todoItem) { if (todoItems == null) { todoItems = new ArrayList(); } todoItems.add(todoItem); } }

Here, we've used our new classes along with Java core classes, to create a List of ToDoItems.

4.2. Fully Qualified Name

Sometimes, we may be using two classes with the same name from different packages. For example, we might be using both java.sql.Date and java.util.Date. When we run into naming conflicts, we need to use a fully qualified class name for at least one of the classes.

Let's use TodoItem with a fully qualified name:

public class TodoList { private List todoItems; public void addTodoItem(com.baeldung.packages.domain.TodoItem todoItem) { if (todoItems == null) { todoItems = new ArrayList(); }todoItems.add(todoItem); } // standard getters and setters }

5. Compiling with javac

When it's time to compile our packaged classes, we need to remember our directory structure. Starting in the source folder, we need to tell javac where to find our files.

We need to compile our TodoItem class first because our TodoList class depends on it.

Let's start by opening a command line or terminal and navigating to our source directory.

Now, let's compile our com.baeldung.packages.domain.TodoItem class:

> javac com/baeldung/packages/domain/TodoItem.java

If our class compiles cleanly, we'll see no error messages and a file TodoItem.class should appear in our com/baeldung/packages/domain directory.

For types that reference types in other packages, we should use the -classpath flag to tell the javac command where to find the other compiled classes.

Now that our TodoItem class is compiled, we can compile our TodoList and TodoApp classes:

>javac -classpath . com/baeldung/packages/*.java

Again, we should see no error messages and we should find two class files in our com/baeldung/packages directory.

Let's run our application using the fully qualified name of our TodoApp class:

>java com.baeldung.packages.TodoApp

Our output should look like this:

6. Conclusion

In this short article, we learned what a package is and why we should use them.

We discussed naming conventions and how packages relate to the directory structure. We also saw how to create and use packages.

Finally, we went over how to compile and run an application with packages using the javac and java commands.

Пълният примерен код е достъпен в GitHub.