شنبه ۲۹ دي ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش جاوا - پکیج‌ها

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

یک پکیج می‌تواند به عنوان گروه‌بندی از انواع مرتبط (کلاس‌ها، اینترفیس‌ها، انواع شمارشی و انوتیشن‌ها) با دسترسی محافظتی و مدیریت نیم‌فضا تعریف شود.

بعضی از پکیج‌های موجود در جاوا عبارتند از -

  • java.lang - مجموعه کلاس‌های بنیادی

  • java.io - کلاس‌های ورودی، خروجی در این پکیج قرار دارند

برنامه‌نویسان می‌توانند پکیج‌های خود را تعریف کنند تا گروهی از کلاس‌ها/انواع مرتبط و غیره را بسته بندی کنند. گروه‌بندی کلاس‌ها و اینترفیس‌های مرتبطی که شما پیاده‌سازی کرده‌اید، به خوبی می‌تواند به برنامه‌نویس کمک کند تا متوجه شود که کلاس‌ها، اینترفیس‌ها، انواع شمارشی و انوتیشن‌ها مرتبط هستند.

زیرا که پکیج یک فضای نام جدید ایجاد می‌کند، هیچ تداخل نامی با نام‌های موجود در پکیج‌های دیگر وجود نخواهد داشت. با استفاده از پکیج‌ها، کنترل دسترسی راحت‌تر می‌شود و همچنین یافتن کلاس‌های مرتبط نیز آسان‌تر می‌شود.

ایجاد پکیج

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

بیانیه پکیج باید در خط اول فایل منبع قرار گیرد. در هر فایل منبع فقط می‌توان یک بیانیه پکیج داشت و این بیانیه برای تمامی انواع موجود در فایل اعمال می‌شود.

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

برای کامپایل برنامه‌های جاوا با بیانیه پکیج، باید از گزینه -d استفاده کنید همانند زیر.


javac -d Destination_folder file_name.java

سپس یک پوشه با نام پکیج داده شده در مقصد مشخص شده ایجاد می‌شود و فایل‌های کلاس کامپایل شده در آن پوشه قرار می‌گیرند.

مثال

بیایید به مثالی نگاهی بیندازیم که یک پکیج به نام animals ایجاد می‌کند. استفاده از حروف کوچک برای نام‌های پکیج یک شیوه‌ی خوب است تا هرگونه تداخل با نام‌های کلاس‌ها و اینترفیس‌ها را جلوگیری کند.

مثال پکیج زیر شامل یک اینترفیس با نام animals است:


/* File name : Animal.java */
package animals;

interface Animal {
   public void eat();
   public void travel();
}

حالا، بیایید رابط فوق را در همان پکیج animals پیاده‌سازی کنیم −


package animals;
/* File name : MammalInt.java */

public class MammalInt implements Animal {

   public void eat() {
      System.out.println("Mammal eats");
   }

   public void travel() {
      System.out.println("Mammal travels");
   } 

   public int noOfLegs() {
      return 0;
   }

   public static void main(String args[]) {
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
} 

حالا فایل‌های جاوا را به صورت زیر کامپایل کنید −


$ javac -d . Animal.java 
$ javac -d . MammalInt.java

حالا یک پکیج/پوشه با نام animals در دایرکتوری فعلی ایجاد خواهد شد و فایل‌های کلاس در آن قرار خواهند گرفت همانطور که در زیر نشان داده شده است.

پکیج‌ها

شما می‌توانید فایل کلاس را درون پکیج اجرا کرده و نتیجه را همانطور که در زیر نشان داده شده است، دریافت کنید.


Mammal eats
Mammal travels

کلمه کلیدی import

اگر یک کلاس می‌خواهد از یک کلاس دیگر در همان پکیج استفاده کند، نیازی به استفاده از نام پکیج نیست. کلاس‌های موجود در همان پکیج بدون نیاز به هرگونه نحو خاصی از یکدیگر پیدا می‌شوند.

مثال

در اینجا، یک کلاس به نام Boss به پکیج حقوق و دستمزد اضافه شده است که قبلاً شامل کلاس Employee بوده است. سپس Boss می‌تواند به کلاس Employee ارجاع دهد بدون استفاده از پیشوند حقوق و دستمزد، همانطور که در کلاس Boss زیر نشان داده شده است.


package payroll;
public class Boss {
   public void payEmployee(Employee e) {
      e.mailCheck();
   }
}

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

  • می‌توان از نام کامل کلاس استفاده کرد. به عنوان مثال −

payroll.Employee
  • پکیج می‌تواند با استفاده از کلمه کلیدی import و wild card (*) وارد شود. به عنوان مثال −


import payroll.*;
  • خود کلاس می‌تواند با استفاده از کلمه کلیدی import وارد شود. به عنوان مثال −

import payroll.Employee;

توجه − یک فایل کلاس می‌تواند شامل هر تعداد اظهارات import باشد. اظهارات import باید پس از اظهارات package و قبل از تعریف کلاس ظاهر شوند.

ساختار دایرکتوری پکیج‌ها

دو نتیجه مهم بوجود می‌آید وقتی یک کلاس در یک پکیج قرار می‌گیرد −

  • نام پکیج بخشی از نام کلاس می‌شود، همانطور که در بخش قبلی توضیح داده شد.

  • نام پکیج باید با ساختار دایرکتوری مطابقت داشته باشد که در آن بایت‌کد مربوطه وجود دارد.

اینجا یک راه ساده برای مدیریت فایل‌هایتان در جاوا است −

کد منبع برای یک کلاس، رابط، شمارش یا نوع توضیحی را در یک فایل متنی قرار دهید که نام آن نام سادهٔ نوع است و پسوند آن .java است.

به عنوان مثال −


// File Name :  Car.java
package vehicle;

public class Car {
   // Class implementation.   
}

حالا، فایل منبع را در یک دایرکتوری قرار دهید که نام آن نشان دهنده نام پکیج است که کلاس متعلق به آن است −


....\vehicle\Car.java

حالا، نام کلاس و مسیر فایل به شرح زیر خواهد بود −

  • نام کلاس → vehicle.Car
  • مسیر فایل → vehicle\Car.java (در ویندوز)

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

مثال − نام دامنه اینترنتی یک شرکت apple.com باشد، در این صورت همه نام‌های پکیج‌های آن با com.apple. شروع می‌شود. هر جزء از نام پکیج متناظر با یک زیردایرکتوری است.

مثال − اگر شرکت یک پکیج com.apple.computers داشته باشد که شامل یک فایل منبع Dell.java است، آن در یک سری زیردایرکتوری مانند این قرار خواهد گرفت −


....\com\apple\computers\Dell.java

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

برای مثال −

// File Name: Dell.java
package com.apple.computers;

public class Dell {
}

class Ups {
}

حالا، این فایل را با استفاده از گزینه -d به شرح زیر کامپایل کنید −


$javac -d . Dell.java

فایل‌ها به شرح زیر کامپایل خواهند شد −

.\com\apple\computers\Dell.class
.\com\apple\computers\Ups.class

شما می‌توانید همه کلاس‌ها یا اینترفیس‌هایی که در \com\apple\computers\ تعریف شده‌اند را به شرح زیر وارد کنید −

import com.apple.computers.*;

.

مانند فایل‌های منبع .java، فایل‌های کامپایل شده .class نیز باید در یک سری از دایرکتوری‌ها قرار داشته باشند که نام بسته را منعکس کنند. با این حال، مسیر فایل‌های .class نیازی به یکسان بودن با مسیر فایل‌های .java منبع ندارد. شما می‌توانید دایرکتوری‌های منبع و کلاس را به صورت مجزا تنظیم کنید، مانند −

<path-one>\sources\com\apple\computers\Dell.java

<path-two>\classes\com\apple\computers\Dell.class

با انجام این کار، امکان دسترسی به دایرکتوری کلاس‌ها برای برنامه‌نویسان دیگر بدون فاش کردن منابع شما وجود دارد. همچنین باید به این شیوه مدیریت فایل‌های منبع و کلاس بپردازید تا کامپایلر و ماشین مجازی جاوا (JVM) تمامی انواعی که برنامه شما استفاده می‌کند را پیدا کنند.

مسیر کامل به دایرکتوری کلاس‌ها، <path-two>\classes، مسیر کلاس نامیده می‌شود و با استفاده از متغیر سیستمی CLASSPATH تنظیم می‌شود. هم کامپایلر و هم JVM مسیر فایل‌های .class خود را با اضافه کردن نام بسته به مسیر کلاس ساخت می‌دهند.

به عنوان مثال، فرض کنید <path-two>\classes مسیر کلاس است و نام بسته com.apple.computers است، در این صورت کامپایلر و JVM در <path-two>\classes\com\apple\computers به دنبال فایل‌های .class خواهند گشت.

مسیر کلاس می‌تواند شامل چندین مسیر باشد. مسیرهای چندگانه باید با نقطه ویرگول (ویندوز) یا دونقطه (یونیکس) جدا شوند. به طور پیش فرض، کامپایلر و JVM در دایرکتوری فعلی و فایل JAR شامل کلاس‌های پلتفرم جاوا جستجو می‌کنند تا این دایرکتوری‌ها به طور خودکار در مسیر کلاس قرار گیرند.

تنظیم متغیر سیستمی CLASSPATH

برای نمایش متغیر CLASSPATH فعلی، از دستورات زیر در ویندوز و یونیکس (شل Bourne) استفاده کنید −

  • در ویندوز → C:\> set CLASSPATH
  • در یونیکس → % echo $CLASSPATH

برای حذف محتوای کنونی متغیر CLASSPATH، از دستورات زیر استفاده کنید −

  • در ویندوز → C:\> set CLASSPATH =
  • در یونیکس → % unset CLASSPATH; export CLASSPATH

برای تنظیم متغیر CLASSPATH −

  • در ویندوز → set CLASSPATH = C:\users\jack\java\classes
  • در یونیکس → % CLASSPATH = /home/jack/java/classes; export CLASSPATH