جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی

۷ مطلب با موضوع «java :: Core Fundamental» ثبت شده است

 در ارث بری عناصر private هم ارث بری میشوند ولی فقط برای عناصر پدر قابل دسترس خواهند بود .


اگر در یک توالی ارث بری 4 کلاس پشت سر هم از هم ارث بری کرده باشند موقع ساختن یک Object جدید از آخرین فرزند به ترتیب از اولین نسل متد constractor آن call میشود تا به فرزند آخر برسد


اگر متدی در پدر وجود داشت و در فرزند متدی با همان نام ولی آرگومان های متفاوت ایجاد کنیم override نکردیم بلکه overload کرده ایم و با توجه به نیاز میتوان از هر دو متد استفاده کرد


متد final شده دیگر توسط فرزندان قابل override نسیت


از نظر OOP در ارث بری متد ها هنگام Override کردن حق نداریم سطح دسترسی را محدود تر کنیم مثلا متد public در پدر نمیتواند بصورت private در فرزند override شود


دو فرزندی که یک پدر مشترک دارند ولی در یک سلسله توارثی نباشند قابل cast به هم نیستند


قوانین Overriding :

متد public باید بصورت public شده override شود

متد protected باید بصورت public یا protected شده override شود

متد default (خالی) باید بصورت public یا protected یا default شده override شود

متد private قابل override نیست

آرگومان و نوع برگشتی متد ها باید در کلاس های فرزند و والد یکسان باشد



نوع داده های Enum از ارث بری پشتیبانی نمیکنند چون نیازی هم ندارند !



هر زبان برنامه نویسی که قابلیت سه اصل :


1-encapsulation

2-inheritance

3-polymorphism

4- و گاهی abstraction


را داشته باشد میتوانیم بگوییم آن زبان شی گرا است


encapsulation : این اصل میگوید که لازم نیست بقیه کامپوننت ها تمامی اجزا کلاس را ببینند و با استفاده از access modifier ها این دسترسی را محدود میکنیم که در پست جداگانه به این modifier ها پرداخته ایم


inheritance : با ارث بری هر شی میتواند خصوصیات شی دیگری را کسب کند و از مفهوم طبقه بندی سلسله مراتبی پشتیبانی میکند این امر بسیار مهم است . بیشتر یافته ها و اطلاعات از طریق طبقه بندی سلسله مراتبی یعنی از بالا به پایین قابل مدیریت میشوند


polymorphism : توانایی ظاهر شدن یک شی در چندین قالب را polymorphism میگویند و قدرت شی گرایی به حداکثر خود میرسد و بر سه نوع میباشد :


1- Ad-Hoc : ما میتوانیم یک درخواست مشترک را برای انواع زیر کلاس ها ارسال کنیم که این زیر کلاس ها واسط مشترکی دارند و این درخواست یکسان ما نسبت به پیاده سازی های مختلف رفتار متفاوتی را دارند همچنین یک متد میتواند چندین Overload داشته باشد و در زمان runtime جاوا تصمیم میگیرد که از کدام یک طبق نیاز باید استفاده شود که به آن  dynamic polymorphism هم میگویند همچنین یک متد میتواند چندین Override داشته باشد که در زمان Compile time نوع متد را مشخص میکند که به آن static polymorphism میگویند

2- Parametric : همان استفاده از Generic ها است Object هایی از جنس نامعلوم که در Runtime نوع آن مشخص میشود 

3- Subtype : ما میتوانیم به ازای یک پدر چندین فرزند داشته باشیم با پیاده سازی های متفاوت ، با قابلیت polymorphism میتوان یک Object Variable از نوع پدر داشته باشیم و هر کدام از پیاده سازی هایش را به آن نسبت دهیم 



فرایند تولید کد OOP : 


OOA : تجزیه و تحلیل از نگاه شی گرایی

OOD : استخراج و طراحی کلاس و سایر اجزای مود نیاز

OOP : مرحله کد زنی و پیاده سازی پلن شی گرایی

OOT : مرحله تست کد که بسته به نوع متدولوژی توسعه گاهی اول تست کد ها را مینویسند گاهی همراه با کد اصلی و گاهی آخر 


در OOA سه خانواده از کلاس ها را شناسایی میکنیم : 


1-Entity

2-Boundray

3-Control


Entity : کلاس هایی هستند که قرار است دیتا های اصلی برنامه را بصورت طولانی مدت نگه دارند و اصلاعات آن در ریسورسی مثل DB , File System و... ذخیره میشوند

Boundray : با دنیای بیرون ارتباط برقرار میکند که ممکن است یک کابر باشد یا یک کامپوننت و یا ماشین دیگر باشد مثل UI

Control : فرایند هایی که در یک سیستم داریم نقش ایم کلاس ها است و کار کنترل روی دیتا را انجام میدهند 

به کلاس های بالا در مرحله OOD میتواند نقش های دیگری را اضافه کرد


OOD : در این مرحله مشخص میکنیم که دیتا چگونه قرار است دریافت و ذخیره شود و بعد مشخص میکنیم که کاربر چگونه میتواند با سیستم تعامل داشته باشد که به آن لایه ارائه یا View میگویند 

در این مرحله به شناسایی کلاس های زیر می پردازیم :

Business Object :  گاهی به آن EntityModel یا DomainModel هم گفته میشود که هم دیتای Business را دارد و هم شامل متد هایی برای عملیات روی دیتا  و هم شامل متد هایی برای save  و load کردن از Data Resource

Trasfer/Value Object : که به آن DTO یا VO یا TO هم گفته میشود این کلاس ها برای نقل و انتقال و نگه داری دیتا مورد استفاده قرار میگیرند


Data Access Object : کلاس هایی هستند که دیتای Entity را به Data Resource ارتباط میدهند و بعضی مواقع Transaction ها را مدیریت میکنند 


OOP : مراحل قبل را بصورت کد در می آوریم و پیاده سازی میکنیم


یک برنامه نویس حرفه ای شی گرا هیچ وقت کارش را از لایه ارائه یا طراحی DB شروع نمیکند گام اول شناسایی و در آوردن کلاس ها از روی usecase ها و مشخص کردن کارهایی که قرار است در سیستم انجام شود و ارتباط آن با قسمت های دیگر است 


همه زبان ها شی گرا نیستند و شبیه به آنچه که در اصول شی گرایی آورده شد را شبیه سازی میکنند تا به شی گرایی برسند ولی در اصل آن زبان برای شی گرایی ساخته نشده است و باید به این نکته دقت کرد


جاوا به طور کامل شی گرا است و قدرت توسعه پذیری در زبان جاوا بر اساس همین شی گرایی می باشد



اصولا در طراحی OOP دسترسی مستقیم field ها به بیرون از کلاس نمیدهیم و از setter و getter متد ها استفاده میکنیم که جز قواعد Java Bean است 

به setter متدها mutetor  و به getter متد ها accessor متد هم گفته میشود

متد getter تنها مقدار را برمی گرداند و نه متغییر را از اینرو نمیتوان مقدار جدیدی به متغییر مربوطه ارسال کرد و با استفاده از getter میتوان اطمینان حاصل کرد که عامل دیگری نمیتواند روی دیتای ما تاثیری نمیگذارد و تنها این عمل توسط setter قابل انجام است


طی پیشرفت OOP به مفاهیم موئلفه گرایی (COP (component oriented programming و (CBD (component base development که در آن مجموعه چندین Object را تبدیل میکنیم به یک Reusable Component که این کامپوننت ها به صورت مجموع در کنار هم قرار میدهند و برنامه ساخته میشود 

(RAD (rapid application developing بر همین اساس موئلفه گرایی ساخته میشود 


(AOP (aspect/agent oriented programming : همان OOP است اما یکسری قطعه کد به کد اصلی برنامه اضافه میکند که مثلا قبل از اجرای متد یک کاری را انجام دهد ، بعد از اتمام کار متد یک کاری دیگری انجام دهد و یا در حین رخ دادن خطا کاری دیگری انجام گیرد اضافه کردن Logger به برنامه یکی از ساده ترین کارهای قابل انجام است

اگر به کامپوننت های AOP یکسری امکانات و ویژگی های رفتار هوشمند اضافه شود یعنی بتوانند محیط خود را sens کنند و قابلیت تطبیق با محیط را داشته باشند ، گاهی بتوانند حرکت کنند و مابقی اعمال هوشمند را انجام دهند به دسته های دیگری تقسیم میشوند :

Mobile Agent : به agent هایی که میتوانند روی net حرکت کنند

Intelligent Agent : به agent هایی که قابلیت تطبیق با محیط را دارند



SOA : از مجموع component ها یک service بوجود می آید که بخشی از business  و مستقل باشند و به بخش های دیگر وابسته نباشند و به تنهایی قابل استفاده باشند service oriented architecture بوجود می آید که از فرمت SOAP برای تبادل داده استفاده میکند که بیشتر به صورت remote استفاده میشود به این سرویس ها web service هم گفته میشود


 

 

پیش فرض اعداد اعشاری در جاوا بصورت double است و نمیتوانید float num=12.5 را ارسال کنید و حتما باید بصورت 12.5f ارسال شود

 

 

 

تقسیم بر صفر : در تمامی حالت تولید Exception میکند تنها دو دیتا تایپ Float و Double هستند که در صورت تقسیم عدد بر صفر بی نهایت را نشان میدهند 

Float.NEGATIVE_INFINITY

Float.POSITIVE_INFINITY

Double.POSITIVE_INFINITY

Double.NEGATIVE_INFINITY

 

حالت مبهم اعداد : دو دیتا تایپ Float و Double حالت NaN یا مبهم میتوانند برای مقادیر تقسیم صفر بر صفر بگیرند

 

String Pool : زمانی که چندمتغیر String مقدار یکسانی داشته باشند جاوا یک مقدار را در نظر میگیرد و بقیه متغییر ها فقط به آن اشاره میکنند این برای صرفه جویی در حافظه است و فقط هم خاص String است

 

 String ها Immutable هستند و با دادن مقدار جدید ، مقدار قبلی روی حافظه رم قابل استفاده نیست و مقدار جدیدی در رم ایجاد میشود


قبل از اینکه GC ابجکت garbage شده را بردارد متد .finilize را صدا خواهد زد


وقتی از داده های Generic استفاده میکنیم مجاز نیستیم داده هایی از جنس پدر به فرزند assign کنیم Down Casting مجاز نیست ولی میتوانیم Up Casting داشته باشیم

        List<Integer> list = new ArrayList<>();

        Number num = 21;

        list.add(num);

کد بالا خطای compile time خواهد داشت



در یک کلاس میتوانیم کلاس های دیگری هم داشته باشیم ولی فقط یک کلاس میتواند public باشد و اسم فایل هم به نام آن تولید خواهد شد


Fast Fail : هرگاه یک ابجکت از نوع Collection داشته باشیم و مقادیر آن در حال دریافت باشد و توسط عامل دیگری تغییر کند یک شکست سریع اتفاق افتاده است

Collection c = new ArrayList(); 

Iterator itr = c.iterator(); 

c.add("An object"); 

String s = itr.next();

در این حالت Iterator نا معتبر میشود و خطای  ConcurrentModificationException پرتاب میشود

Auto Boxing : امکان تخصیص اتوماتیک مقادیر primitive به نوع متناظر Reference آن بدون new کردن از آن Object

َAuto Unboxing : امکان تخصیص اتوماتیک مقادیر Reference به نوع متناظر primitive بدون تبدیل کردن 


Up Cast : یا Widening به عمل ارجاع کردن یک کلاس فرزند به کلاس پدر (در درخت توارث از سمت فرزند به سمت پدر بالا میرویم ) که ایمن است چون تمای متد های فرزند در پدر موجود است و موقع call کردن مشکلی وجود ندارد

Down Cast : یا Narrowing به عمل ارجاع کردن یک کلاس پدر به کلاس فرزند (در درخت توارث از سمت پدر به سمت فرزند پایین میرویم ) که همیشه این کار به علت داشتن method  و field های احتمالی بیشتر در کلاس فرزند ، ایمن نیست چون همه متد های فرزند در پدرش ممکن وجود نداشته باشد و موقع call کردن آن متد پیاده سازی ندارد و آن متد و فیلد های فرزند از دسترس خارج خواهند شد چون در Object پدر وجود ندارند که Bind شوند ولی آن فیلد و متد ها در حافظه رم وجود خواهند داشت و اگر زمانی دوباره به Object فرزند cast شوند دوباره قابل استفاده خواهد شد


Mutable : کلاس هایی که field هایشان قابل تغییر هستند Mutable میگویند

Immutable : کلاس هایی که field هایشان تا زمانی که از بین بروند قابل تغییر نیست  Immutable میگویند به عبارتی متدی برای تغییر field ها وجود ندارد


component : به کلاس های تشکیل دهنده برنامه گفته میشود

java bean : به کلاس (component) های جاوا که یکسری قواعد مشخص و استاندارد در طراحی آن بکار گرفته شده باشد java bean میگویند

prototype : به ظاهر تعریف متد prototype میگویند


override : مخصوص متد است و رفتار و پیاده سازی به ارث برده را میتوان عوض کرد همین عمل در مورد فیلد ها hide گفته میشود 

overload : متدهایی با یک نام و آرگومان های متفاوت برای شرایط مختلف قابل استفاده است


abstract : پیاده سازی ندارد

concrete :  پیاده سازی شده است 


super class : به کلاس پدر در جاوا super class میگویند

sub class : به کلاس فرزند در جاوا sub class میگویند


Reference Object :  به Object پدر هم گفته میشود

Actual Object : به Object فرزند هم گفته میشود


Instance یا Object : در فضای heap یک بخشی به ازای کلاس ساخته شده باشد یک Instance یا Object داریم

Instance Variable : فیلد های کلاس که به ازای هر بار new شدن از کلاس یکی ساخته می شود و static نیستند

Class Variable : فیلد های کلاس که به ازای هر بار new شدن کلاس متغییر آن وجود دارد و static است

Final Method : متدی که قابلیت Override ندارد

Final Class : کلاس که دیگر قابل ارث بری نیست و نوع خاص تری ندارد مثلا کلاس singleton باید final باشد چون ممکن است در کلاس فرزند متد getInstance توسط فرزند override شود

Final Variable :  متغییری که مقدار آن قابل تغییر نباشد

ِDynamic Binding : در polymorphism وقتی ما متدی و یک Actual Object به Reference Object نسبت داده باشیم و مشخص نباشد که کد اجرا کننده آن متد کدام یک از متد های سلسله مراتب وراثت است (یعنی متغییر ما Object از نوع reference باشد و برای new شدن از یکی از Actual Object ها استفاده کرده باشیم و حاوی متد هایی باشد با modifier های public ,default , protected که static نباشد ، با توجه به سلسله مراتب Override شدن در وراثت صورت گرفته جاوا بصورت داینامیک)، اتصال متد مناسب در runtime به متد reference را dynamic binding میگویند

Static Binding : وقتی ما متدی داریم با modifier های final , static , private (بخاطر اینکه این سه override نمیشوند )و costractor در compile time آن متد مشخص است که به ازای فراخوانی آن چه کدی باید اجرا شود

به علت static binding بودن متد های private , final , static و costractor میتوان این نتیجه را گرفت که سرعت اجرا بالاتری نسبت به بقیه متد ها دارند و فقط اینا میتوانند inline شوند

inlining : در جاوا اگر مشخص باشد که به ازای متد کدام کد قرار است اجرا شود optimizer جاوا آن کد را inline میکند به جای فراخوانی آن متد 


Overloading Resolution : به تشخیص زبان به استفاده از یکی از متد های Overload شده با توجه به آرگومان های ارسالی Overloading Resolution میگویند


Dynamic Loading : در جاوا با استفاده از Reflection میتوان یک Object جدید تنها با دانستن اسمش آنرا ایجاد کرد :

 String str = (String) Class.forName("java.lang.String").newInstance();


Class Object : اطلاعات کلاس ما در حافظه در شی ای به نام Class Object ذخیره میشود تا قبل از جاوا 8 ، Class Object ها در بخشی از حافظه به نام (Permanent Generation (PermGen به معنای بخشی از حافظه که قرار است به صورت پایدار باقی بمانند ذخیره میشدند که این مشکل را بوجود می آوردند که اگر پروژه ما خیلی بزرگ بود ممکن بود این فضا پر شود و اجرای برنامه با خطا OutOfMemeoryError مواجه بشود این بیشتر برای پروژه هایی که مجبور بودند کتابخانه های زیادی از استفاده کنند دیده میشد البته راه کارهایی براش وجود داشت مثلا حجم حافظه PermGen را افزایش دهیم : java -XX:MaxPermSize=512m MyClass مشابه کاری که با سویچ های Xms- و Xmx- روی Heap انجام میشد

  ولی از جاوا 8 به بالاتر Class Object ها در بخشی از حافظه به نام MetaSpace نگهداری میشود و PermGen حذف شده و دیگر مشکلاتش را هم نداریم . MetaSpace تا جایی که حافظه جا داشته باشد اجازه استفاده را میدهد


Young : بخشی از حافظه Heap است که اشیاء جدید را نگهداری میکند

Tenured : بخشی از حافظه Heap است که اشیاء کهنه را نگهداری میکند


finalize : متدی است که در ابجکت Object موجود است و GC هنگامی که هیچ رفرنسی به آن ابجکت نباشد قبل از گاربیج کردن این متد را فراخوانی میکند و ما مثلا میتوانیم با override کردن این متد عملیاتی را انجام دهیم که به ندرت کاربرد دارد


atomic : عملیات اتمیک به عملیاتی گفته میشود که از ابتدا تا انتهای آن یکباره و بدون دخالت ترد دیگری یا انجام میشود و یا انجام نمیشود










JNI : وقتی بخواهیم یک کد native را فراخوانی کنیم از jni استفاده میکنیم با jni این امکان وجود دارد که یک متدی را با native modifier  تعریف کنیم و کد native مثلا c را از طریق آن اجرا کنیم ، سایر کلاس ها و متد ها آن کلاس را بصورت یک کد جاوا میبینند 


JNDI : یک API است که به برنامه های جاوا اجازه پیدا کردن یک Object از طریق آنها را میدهند .


HotSpot : این بخش به کمک JIT بصورت داینامیک کد های بایت کد جاوا را به کد ماشین تبدیل میکند و همواره کد های ماشین را برای performance برای اجرا های بعدی چک میکند و در صورت امکان از بهترین کد ماشین برای اجرا های بهتر بعدی استفاده میکن


JIT : قسمتی از HotSpot است که وقتی کد های جاوا به بایت کد ای کلاس تبدیل میشوند هنوز به زبان ماشین تبدیل نشده اند JIT در مقصد و جایی که قرار است کد ما اجرا شود بایت کد ها را به زبان ماشین ترجمه میکند