دوره‌ها / JAVA / پکیج‌ها و API (Java Packages / API)

پکیج‌ها و API (Java Packages / API)

15 دقیقه Article

پکیج‌ها و API: سازمان‌دهی کتابخانه‌ای 📂📦

پکیج (Package) در جاوا مشابه "پوشه" در کامپیوتر است. ما از پکیج‌ها برای گروه‌بندی کلاس‌های مرتبط استفاده می‌کنیم تا از تداخل نام‌ها جلوگیری کرده و مدیریت پروژه را آسان کنیم.

۱. دسته‌بندی پکیج‌ها

  • پکیج‌های داخلی (Built-in): کتابخانه‌هایی که همراهِ جاوا می‌آیند (مثل java.util).
  • پکیج‌های کاربر (User-defined): پکیج‌هایی که خودمان در پروژه می‌سازیم.

۲. دستور import 📥

برای استفاده از کلاسی که در پکیج دیگری قرار دارد، باید از دستور import در بالای کد استفاده کنیم:

{code_block('import java.util.Scanner; // ورود فقط اسکنر\nimport java.util.*; // ورود تمام کلاس‌های یک پکیج')}
java.lang: این پکیج شامل کلاس‌های پایه مثل String و Math است و به صورت خودکار توسط جاوا وارد می‌شود (نیاز به import ندارد).

۳. ساخت پکیج خودمان

برای قرار دادن یک کلاس در پکیج، اولین خطِ کد باید با دستور package شروع شود:

{code_block('package mypack;\nclass MyClass { ... }')}

توصیه نام‌گذاری:

شرکت‌ها معمولاً از دامنه معکوس سایت خود برای نام پکیج استفاده می‌کنند تا منحصر‌به‌فرد باشد، مثلاً: com.google.search

API چیست؟ مخفف Application Programming Interface است. وقتی می‌گوییم "Java API"، منظورمان همان هزاران کلاسی است که جاوا از قبل برای ما آماده کرده تا کارهای سخت (مثل شبکه یا دیتابیس) را راحت انجام دهیم.
<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: معماری سیستم‌های شیءگرا 🏗️💎

در این بخش، به مفاهیمی می‌پردازیم که تفاوت بین یک برنامه‌نویس معمولی و یک معمار نرم‌افزار را رقم می‌زند.

۱. کد تمیز و اصل ابزارمندی (Abstraction)

در پروژه‌های بزرگ صنعتی، ما سعی می‌کنیم تا حد امکان وابستگی‌ها (Dependencies) را کاهش دهیم. استفاده درست از Interface و Abstract Class باعث می‌شود کدهای ما انعطاف‌پذیر باشند. به قولی: "برنامه‌نویسی برای اینترفیس، نه برای پیاده‌سازی".

۲. مدیریت پکیج‌ها و جلوگیری از تداخل

پکیج‌بندی حرفه‌ای فقط برای نظم نیست؛ بلکه برای کنترلِ Visibility است. با استفاده درست از سطوح دسترسی (مثل protected و default) در سطح پکیج، می‌توانید از دسترسی‌های غیرمجاز به متدهای داخلی کلاس‌ها جلوگیری کنید.

۳. ترکیب به جای وراثت (Composition over Inheritance)

وراثت (Inheritance) ابزار قدرتمندی است، اما استفاده بیش از حد از آن باعث ایجاد "زنجیره‌های سفت‌وسخت" (Tight Coupling) می‌شود. در بسیاری از موارد، استفاده از ترکیب (داشتنِ یک شیء داخل شیء دیگر) راه‌حل منعطف‌تری برای گسترشِ کدهای شماست.

نکته پایانی: هدف از یادگیری این مفاهیمِ پیشرفته، نوشتن کدی است که نه تنها امروز کار کند، بلکه سال‌ها بعد هم به راحتی قابل تغییر و توسعه باشد.

نکته تکمیلی: تضادِ نام‌ها در پکیج‌ها 🌪️

یکی از بزرگترین چالش‌ها در پروژه‌های بزرگ صنعتی، تضاد نام‌ها (Naming Collisions) است. تصور کنید دو پکیج مختلف هر دو کلاسی به نام Date داشته باشند. در این صورت جاوا به شما اجازه نمی‌دهد هر دو را به صورت معمولی import کنید. در چنین شرایطی، باید از نام کامل کلاس (Fully Qualified Name) استفاده کنید، مثلاً: java.util.Date و java.sql.Date. این کار باعث شفافیت کامل در کد می‌شود.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

استفاده از کتابخانه داخلی Easy
سوال تمرین

پکیج java.util.Random را وارد (import) کنید. سپس در متد main یک شیء از کلاس Random بسازید و آن را چاپ نکنید (فقط ساخت شیء کافیست).

پاسخ تمرین
JAVA
import java.util.Random;

public class Main {
  public static void main(String[] args) {
    Random rand = new Random();
    System.out.println("Success");
  }
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.