🔹 ماشین مجازی جاوا (JVM): موتور اصلی اجرای بایتکد جاوا که باعث استقلال از پلتفرم میشود.
🔹 محیط اجرای جاوا (JRE): شامل ماشین مجازی جاوا بههمراه کتابخانههای ضروری برای اجرای برنامههای جاوا است.
🔹 کیت توسعه جاوا (JDK): مجموعهای کامل برای توسعهدهندگان که شامل محیط اجرای جاوا، کامپایلر و ابزارهایی برای نوشتن، کامپایل و اشکالزدایی کدهای جاوا میباشد.
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
برنامه نویسی جاوا | Java
برخی افراد میپرسند برای استخدام شدن به عنوان برنامهنویس جاوا چه مهارتهایی نیاز است؟ پاسخ ساده است: کافیست به سایتهای کاریابی مانند جابویژن، جابینجا و سایر پلتفرمهای مشابه مراجعه کنید. در بخش توضیحات آگهیهای استخدام مرتبط با جاوا، فهرست دقیقی از مهارتها و تخصصهای مورد نیاز درج شده است برید همونا رو یاد بگیرید.
#️⃣ در جاواپرو برخی از این تخصص ها رو آموزش دادیم
🌟 لیست دوره های آکادمی جاواپرو
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
الگوهای طراحی(Design Patterns)
مهم با مثالهای واقعی از دنیای نرمافزار
۱. بهروزرسانی خودکار فید در فیسبوک ← الگوی ناظر (Observer)
هر زمان پستی تغییر میکند، همه دنبالکنندگان بهطور خودکار مطلع میشوند.
۲. فیلتر شدن پیامها در اسلک ← الگوی زنجیره مسئولیت (Chain of Responsibility)
پیامها بهترتیب از فیلتر اسپم، منشنها و سپس اعلانها عبور میکنند.
۳. ارتباط میان اپهای آیفون بدون آشنایی مستقیم ← الگوی میانجی (Mediator)
مرکز NSNotification پیامها را بین اپلیکیشنها هدایت میکند.
۴. عملکرد دقیق undo و redo در اپ Todoist ← الگوی فرمان (Command)
هر اقدام به صورت یک شیء قابل برگشت ذخیره میشود.
۵. کاهش نویز خودکار در تماسهای زوم ← الگوی تزیینگر (Decorator)
پردازشگرهای صوتی بهصورت لایهای به جریان تماس افزوده میشوند.
۶. اتصال بدون مشکل سرویسهای AWS به یکدیگر ← الگوی افزونه (Plugin)
مرزهای مشخصی بین ماژول اصلی و سرویسهای جانبی وجود دارد.
۷. پردازش هزاران تراکنش در اپهای بانکی ← الگوی استخر اشیاء (Object Pool)
اتصالات پرهزینه به پایگاه داده، مجدداً استفاده میشوند.
۸. بازیابی خودکار در صورت خرابی سرورهای نتفلیکس ← الگوی تلاش مجدد (Retry)
تا رسیدن به وضعیت مطلوب، عملیات بارها امتحان میشود.
۹. ایجاد پلیلیستهای شخصی در اسپاتیفای ← الگوی استراتژی (Strategy)
الگوریتمهای مختلف براساس سلیقه موسیقی کاربران اجرا میشوند.
۱۰. همگامسازی فایلها در گوگل درایو ← الگوی وضعیت (State)
رفتار فایلها هنگام آپلود با زمانی که همگام شدهاند متفاوت است.
۱۱. بارگذاری روان استوریها در اینستاگرام ← الگوی پروکسی (Proxy)
ابتدا تصاویر پیشفرض نمایش داده میشوند تا تصاویر اصلی بارگذاری شوند.
۱۲. مدیریت انواع پیام در واتساپ ← الگوی کارخانهای (Factory)
برای پیام متنی، تصویری یا صوتی، شیء مرتبط ساخته میشود.
۱۳. پخشکننده ویدیوی یوتیوب روی هر وبسایتی کار میکند ← الگوی تطبیقدهنده (Adapter)
پخشکننده با انواع سیستمهای جاسازی هماهنگ میشود.
۱۴. نمایش یکنواخت املاک در Airbnb ← الگوی روش قالبی (Template Method)
ساختار نمایش ثابت است ولی اطلاعات هر ملک متفاوت است.
۱۵. اجرای اپلیکیشن اوبر روی همه پلتفرمها ← الگوی پل (Bridge)
رابط کاربری از بخشهای وابسته به سیستمعامل جدا شده است.
➡️ اشتراک 👍 لایک 💬 کامنت
مهم با مثالهای واقعی از دنیای نرمافزار
۱. بهروزرسانی خودکار فید در فیسبوک ← الگوی ناظر (Observer)
هر زمان پستی تغییر میکند، همه دنبالکنندگان بهطور خودکار مطلع میشوند.
۲. فیلتر شدن پیامها در اسلک ← الگوی زنجیره مسئولیت (Chain of Responsibility)
پیامها بهترتیب از فیلتر اسپم، منشنها و سپس اعلانها عبور میکنند.
۳. ارتباط میان اپهای آیفون بدون آشنایی مستقیم ← الگوی میانجی (Mediator)
مرکز NSNotification پیامها را بین اپلیکیشنها هدایت میکند.
۴. عملکرد دقیق undo و redo در اپ Todoist ← الگوی فرمان (Command)
هر اقدام به صورت یک شیء قابل برگشت ذخیره میشود.
۵. کاهش نویز خودکار در تماسهای زوم ← الگوی تزیینگر (Decorator)
پردازشگرهای صوتی بهصورت لایهای به جریان تماس افزوده میشوند.
۶. اتصال بدون مشکل سرویسهای AWS به یکدیگر ← الگوی افزونه (Plugin)
مرزهای مشخصی بین ماژول اصلی و سرویسهای جانبی وجود دارد.
۷. پردازش هزاران تراکنش در اپهای بانکی ← الگوی استخر اشیاء (Object Pool)
اتصالات پرهزینه به پایگاه داده، مجدداً استفاده میشوند.
۸. بازیابی خودکار در صورت خرابی سرورهای نتفلیکس ← الگوی تلاش مجدد (Retry)
تا رسیدن به وضعیت مطلوب، عملیات بارها امتحان میشود.
۹. ایجاد پلیلیستهای شخصی در اسپاتیفای ← الگوی استراتژی (Strategy)
الگوریتمهای مختلف براساس سلیقه موسیقی کاربران اجرا میشوند.
۱۰. همگامسازی فایلها در گوگل درایو ← الگوی وضعیت (State)
رفتار فایلها هنگام آپلود با زمانی که همگام شدهاند متفاوت است.
۱۱. بارگذاری روان استوریها در اینستاگرام ← الگوی پروکسی (Proxy)
ابتدا تصاویر پیشفرض نمایش داده میشوند تا تصاویر اصلی بارگذاری شوند.
۱۲. مدیریت انواع پیام در واتساپ ← الگوی کارخانهای (Factory)
برای پیام متنی، تصویری یا صوتی، شیء مرتبط ساخته میشود.
۱۳. پخشکننده ویدیوی یوتیوب روی هر وبسایتی کار میکند ← الگوی تطبیقدهنده (Adapter)
پخشکننده با انواع سیستمهای جاسازی هماهنگ میشود.
۱۴. نمایش یکنواخت املاک در Airbnb ← الگوی روش قالبی (Template Method)
ساختار نمایش ثابت است ولی اطلاعات هر ملک متفاوت است.
۱۵. اجرای اپلیکیشن اوبر روی همه پلتفرمها ← الگوی پل (Bridge)
رابط کاربری از بخشهای وابسته به سیستمعامل جدا شده است.
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
🔵 تفاوت Overloading و Overriding در جاوا – درک عمیق از رفتار متدها در زمان اجرا و کامپایل
در زبان جاوا، دو مفهوم Overloading (بارگذاری مجدد متد) و Overriding (بازنویسی متد) ممکن است در ظاهر مشابه بهنظر برسند، اما در واقع تفاوتهای بنیادی در هدف، زمان تشخیص، وابستگی به وراثت و رفتار در زمان اجرا دارند.
🔹 Overloading
بارگذاری مجدد متد زمانی اتفاق میافتد که چند متد با نام یکسان اما با تعداد یا نوع پارامترهای متفاوت در یک کلاس تعریف شوند. در این حالت، متدهای مختلفی با امضاهای متفاوت ایجاد میشوند و انتخاب اینکه کدام یک فراخوانی شود، در زمان کامپایل (Compile-time) و بر اساس نوع آرگومانها انجام میشود.
در مثال بالا، متد
🔹 Overriding
بازنویسی متد زمانی اتفاق میافتد که یک کلاس فرزند، متدی را که از کلاس والد به ارث برده است، با همان امضا (نام، تعداد و نوع پارامترها) دوباره تعریف کند. این کار باعث تغییر رفتار آن متد برای اشیاء نوع فرزند میشود. تشخیص اینکه کدام نسخه از متد اجرا شود، در زمان اجرا (Runtime) و بر اساس نوع واقعی شیء انجام میشود.
در این مثال، متد
✅ نکته مفهومی مهم:
در Overloading، انتخاب متد در زمان کامپایل و بر اساس امضای متد و نوع آرگومانها انجام میشود.
در Overriding، انتخاب متد در زمان اجرا و بر اساس نوع واقعی شیء انجام میشود؛ این یعنی پلیمورفیسم واقعی در جاوا فقط با Overriding اتفاق میافتد.
درک دقیق این تفاوت، در طراحی کلاسهای قابل توسعه، رعایت اصل Liskov Substitution و نوشتن کدی قابل نگهداری بسیار حیاتی است.
در زبان جاوا، دو مفهوم Overloading (بارگذاری مجدد متد) و Overriding (بازنویسی متد) ممکن است در ظاهر مشابه بهنظر برسند، اما در واقع تفاوتهای بنیادی در هدف، زمان تشخیص، وابستگی به وراثت و رفتار در زمان اجرا دارند.
🔹 Overloading
بارگذاری مجدد متد زمانی اتفاق میافتد که چند متد با نام یکسان اما با تعداد یا نوع پارامترهای متفاوت در یک کلاس تعریف شوند. در این حالت، متدهای مختلفی با امضاهای متفاوت ایجاد میشوند و انتخاب اینکه کدام یک فراخوانی شود، در زمان کامپایل (Compile-time) و بر اساس نوع آرگومانها انجام میشود.
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
در مثال بالا، متد
add
دوبار با پارامترهای متفاوت تعریف شده است، اما هر دو در یک کلاس هستند و وراثتی در کار نیست. این یعنی Overloading.🔹 Overriding
بازنویسی متد زمانی اتفاق میافتد که یک کلاس فرزند، متدی را که از کلاس والد به ارث برده است، با همان امضا (نام، تعداد و نوع پارامترها) دوباره تعریف کند. این کار باعث تغییر رفتار آن متد برای اشیاء نوع فرزند میشود. تشخیص اینکه کدام نسخه از متد اجرا شود، در زمان اجرا (Runtime) و بر اساس نوع واقعی شیء انجام میشود.
class Animal {
public void speak() {
System.out.println("Animal speaks");
}
}
class Dog extends Animal {
@Override
public void speak() {
System.out.println("Dog barks");
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
animal.speak(); // خروجی: Dog barks
}
}
در این مثال، متد
speak
در کلاس Dog
بازنویسی شده است. با وجود اینکه متغیر animal
از نوع Animal
تعریف شده، خروجی متد speak
در زمان اجرا، وابسته به نوع واقعی شیء (`Dog`) است.✅ نکته مفهومی مهم:
در Overloading، انتخاب متد در زمان کامپایل و بر اساس امضای متد و نوع آرگومانها انجام میشود.
در Overriding، انتخاب متد در زمان اجرا و بر اساس نوع واقعی شیء انجام میشود؛ این یعنی پلیمورفیسم واقعی در جاوا فقط با Overriding اتفاق میافتد.
درک دقیق این تفاوت، در طراحی کلاسهای قابل توسعه، رعایت اصل Liskov Substitution و نوشتن کدی قابل نگهداری بسیار حیاتی است.
#کاربرـپیشرفته
🆔 @javapro_ir
🆔 @group_javapro
👍8❤2
🚀 «تجربه یک برنامه نویس از یک مصاحبه اخیر درباره مایکروسرویسهای جاوا — این چیزها را یاد گرفتم!»
چند روز پیش در یک مصاحبه چالشی درباره مایکروسرویسها شرکت کردم و باور کنید تجربهای واقعاً آموزنده بود. تیم مصاحبهکننده فقط درباره کدنویسی سؤال نکردند — بلکه توانایی حل مسئله در سیستمهای توزیعشده را بهطور واقعی سنجیدند.
در ادامه مهمترین سؤالهایی که از من پرسیده شد را میخوانید 👇
🔹 ارتباط بین سرویسها: چطور تصمیم میگیرید که از REST، gRPC یا صفهای پیام (مثل Kafka) برای ارتباط سرویس با سرویس استفاده کنید؟
🔹 کشف سرویسها (Service Discovery): در یک سیستم بزرگ، چطور طراحی میکنید تا سرویسها بتوانند یکدیگر را بهصورت پویا کشف کنند؟
🔹 سازگاری دادهها: چطور تراکنشهای توزیعشده و سازگاری نهایی دادهها را در بین سرویسها مدیریت میکنید؟
🔹 مقاومت و تحمل خطا: چطور از مکانیزمهایی مانند قطع مدار (circuit breaker)، تلاش مجدد (retry) و مسیر جایگزین (fallback) استفاده میکنید؟
🔹 امنیت: برای احراز هویت و مجوزدهی (مثل استفاده از OAuth2، JWT، یا API Gateway) از چه راهکارهایی استفاده میکنید؟
🔹 قابلیت مقیاسپذیری: چطور سرویسها را بهصورت مستقل مقیاسپذیر میکنید بدون اینکه روی سرویسهای دیگر تأثیر بگذارد؟
🔹 مانیتورینگ و لاگگیری: از چه ابزارها یا الگوهایی برای لاگگیری متمرکز و ردیابی توزیعشده استفاده میکنید؟
💡 نکته مهم: تمرکز مصاحبه روی تئوری نبود، بلکه روی توانایی مدیریت چالشهای واقعی در محیط تولید (Production) بود.
اگر در حال آمادهشدن برای مصاحبههای مربوط به مایکروسرویسها هستید، حتماً پاسخهایی کاربردی و همراه با مثالهای واقعی برای این سؤالها داشته باشید — نه فقط تعریفها.
🏅 دوره جامع نخبگان معماری میکروسرویس ها با Java و Spring Boot
➡️ اشتراک 👍 لایک 💬 کامنت
چند روز پیش در یک مصاحبه چالشی درباره مایکروسرویسها شرکت کردم و باور کنید تجربهای واقعاً آموزنده بود. تیم مصاحبهکننده فقط درباره کدنویسی سؤال نکردند — بلکه توانایی حل مسئله در سیستمهای توزیعشده را بهطور واقعی سنجیدند.
در ادامه مهمترین سؤالهایی که از من پرسیده شد را میخوانید 👇
🔹 ارتباط بین سرویسها: چطور تصمیم میگیرید که از REST، gRPC یا صفهای پیام (مثل Kafka) برای ارتباط سرویس با سرویس استفاده کنید؟
🔹 کشف سرویسها (Service Discovery): در یک سیستم بزرگ، چطور طراحی میکنید تا سرویسها بتوانند یکدیگر را بهصورت پویا کشف کنند؟
🔹 سازگاری دادهها: چطور تراکنشهای توزیعشده و سازگاری نهایی دادهها را در بین سرویسها مدیریت میکنید؟
🔹 مقاومت و تحمل خطا: چطور از مکانیزمهایی مانند قطع مدار (circuit breaker)، تلاش مجدد (retry) و مسیر جایگزین (fallback) استفاده میکنید؟
🔹 امنیت: برای احراز هویت و مجوزدهی (مثل استفاده از OAuth2، JWT، یا API Gateway) از چه راهکارهایی استفاده میکنید؟
🔹 قابلیت مقیاسپذیری: چطور سرویسها را بهصورت مستقل مقیاسپذیر میکنید بدون اینکه روی سرویسهای دیگر تأثیر بگذارد؟
🔹 مانیتورینگ و لاگگیری: از چه ابزارها یا الگوهایی برای لاگگیری متمرکز و ردیابی توزیعشده استفاده میکنید؟
💡 نکته مهم: تمرکز مصاحبه روی تئوری نبود، بلکه روی توانایی مدیریت چالشهای واقعی در محیط تولید (Production) بود.
اگر در حال آمادهشدن برای مصاحبههای مربوط به مایکروسرویسها هستید، حتماً پاسخهایی کاربردی و همراه با مثالهای واقعی برای این سؤالها داشته باشید — نه فقط تعریفها.
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👾1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔵 کلمه کلیدی `final` در جاوا – کنترل نهایی روی متغیر، متد و کلاس
در زبان جاوا، کلمهی کلیدی final ابزاری بسیار مهم برای ایمنسازی کد، جلوگیری از تغییرات ناخواسته و افزایش خوانایی است. بسته به جایی که استفاده میشود، رفتار متفاوتی دارد، اما همیشه مفهوم "نهایی بودن" یا "غیرقابل تغییر بودن" را منتقل میکند.
🔹 1. استفاده از `final` برای متغیرها
وقتی متغیری به صورت final تعریف شود، مقدار آن فقط یک بار میتواند مقداردهی شود و بعد از آن دیگر نمیتوان مقدارش را تغییر داد.
✔️ این نوع استفاده برای ثابتهایی مثل نرخ مالیات، محدودیتها یا کلیدهای ثابت بسیار مفید است.
🔹 2. استفاده از `final` برای متدها
وقتی یک متد را final میکنید، دیگر هیچ کلاس فرزندی نمیتواند آن متد را بازنویسی (override) کند.
✔️ اینکار زمانی مفید است که نمیخواهید منطق متدی در کلاسهای فرزند تغییر کند.
🔹 3. استفاده از `final` برای کلاسها
اگر یک کلاس را final تعریف کنید، هیچ کلاسی نمیتواند از آن ارثبری کند.
✔️ معمولاً کلاسهایی که فقط شامل توابع کمکی هستند (مثل java.lang.Math) به صورت final تعریف میشوند.
✅ نکته مهم:
اگرچه استفاده از final باعث میشود کد قابلاعتمادتر شود، اما استفادهی بیرویه از آن نیز ممکن است انعطاف کد را کاهش دهد؛ بنابراین باید با دقت و در جای مناسب استفاده شود.
در زبان جاوا، کلمهی کلیدی final ابزاری بسیار مهم برای ایمنسازی کد، جلوگیری از تغییرات ناخواسته و افزایش خوانایی است. بسته به جایی که استفاده میشود، رفتار متفاوتی دارد، اما همیشه مفهوم "نهایی بودن" یا "غیرقابل تغییر بودن" را منتقل میکند.
🔹 1. استفاده از `final` برای متغیرها
وقتی متغیری به صورت final تعریف شود، مقدار آن فقط یک بار میتواند مقداردهی شود و بعد از آن دیگر نمیتوان مقدارش را تغییر داد.
final int MAX_USERS = 100;
MAX_USERS = 150; // خطا: نمیتوان به متغیر final مقدار جدید داد
✔️ این نوع استفاده برای ثابتهایی مثل نرخ مالیات، محدودیتها یا کلیدهای ثابت بسیار مفید است.
🔹 2. استفاده از `final` برای متدها
وقتی یک متد را final میکنید، دیگر هیچ کلاس فرزندی نمیتواند آن متد را بازنویسی (override) کند.
class Person {
public final void printID() {
System.out.println("ID printed.");
}
}
class Student extends Person {
// خطا: نمیتوان متد final را override کرد
public void printID() {
System.out.println("Student ID");
}
}
✔️ اینکار زمانی مفید است که نمیخواهید منطق متدی در کلاسهای فرزند تغییر کند.
🔹 3. استفاده از `final` برای کلاسها
اگر یک کلاس را final تعریف کنید، هیچ کلاسی نمیتواند از آن ارثبری کند.
final class Utility {
public static void log(String message) {
System.out.println("LOG: " + message);
}
}
// خطا: نمیتوان از کلاس final ارثبری کرد
class CustomUtility extends Utility { }
✔️ معمولاً کلاسهایی که فقط شامل توابع کمکی هستند (مثل java.lang.Math) به صورت final تعریف میشوند.
✅ نکته مهم:
اگرچه استفاده از final باعث میشود کد قابلاعتمادتر شود، اما استفادهی بیرویه از آن نیز ممکن است انعطاف کد را کاهش دهد؛ بنابراین باید با دقت و در جای مناسب استفاده شود.
#کاربرـپیشرفته
🆔 @javapro_ir
🆔 @group_javapro
👍6
در آموزشهای پروژهمحور مرتبط با سایت فروشگاهی که در کنار بکاند جاوا به بخش فرانتاند نیز نیاز است، این پرسش مطرح میشود که آیا بخش فرانتاند نیز آموزش داده شود یا تمرکز صرفاً بر بکاند و مباحث جاوا باشد؟
Anonymous Poll
43%
تمرکز بر بک اند و جاوا و استفاده از قالب آماده در بخش فرانت اند
57%
هم بک اند جاوا و فرانت اند آموزش داده شود
🚀 جاوا در حال تکامل است — با مهمترین ویژگیهای نسخههای LTS، همیشه یک قدم جلوتر باشید! ☕✨
🔹 جاوا ۸ – عبارات لامبدا، Stream API، کلاس Optional، API تاریخ و زمان
🔹 جاوا ۱۱ – کلاینت HTTP استاندارد، استفاده از var در لامبداها، بهبودهای رشتهای
🔹 جاوا ۱۷ – رکوردها (Records)، کلاسهای بستهشده (Sealed Classes)، الگوهای تطبیقی (Pattern Matching)، سوییچ پیشرفته
🔹 جاوا ۲۱ – نخهای مجازی (Virtual Threads)، مجموعههای ترتیبی (Sequenced Collections)، API توابع خارجی
🔹 جاوا ۲۲ – الگوهای بینام، قالبهای دستوری (Statement Templates)، Streamهای اولیه (Primitive Streams)
🔹 جاوا ۲۳ – قالبهای رشتهای (String Templates)، مقادیر دامنهدار (Scoped Values)، همزمانی ساختاریافته (پیشنمایش دوم)
🔹 جاوا ۲۴ – API فایل کلاس، جمعآورندههای Stream، کلاسهای تعریفشده ضمنی
💡 چه در حال آمادهسازی برای مصاحبه باشید، چه در حال مدرنسازی کدهای قدیمی یا کشف قابلیتهای جدید، این مرجع همیشه شما را بهروز نگه میدارد!
➡️ اشتراک 👍 لایک 💬 کامنت
در اینجا خلاصهای تصویری و دقیق از ویژگیهای کلیدی ارائهشده در نسخههای LTS اخیر و نسخههای جدید جاوا آمده است:
🔹 جاوا ۸ – عبارات لامبدا، Stream API، کلاس Optional، API تاریخ و زمان
🔹 جاوا ۱۱ – کلاینت HTTP استاندارد، استفاده از var در لامبداها، بهبودهای رشتهای
🔹 جاوا ۱۷ – رکوردها (Records)، کلاسهای بستهشده (Sealed Classes)، الگوهای تطبیقی (Pattern Matching)، سوییچ پیشرفته
🔹 جاوا ۲۱ – نخهای مجازی (Virtual Threads)، مجموعههای ترتیبی (Sequenced Collections)، API توابع خارجی
🔹 جاوا ۲۲ – الگوهای بینام، قالبهای دستوری (Statement Templates)، Streamهای اولیه (Primitive Streams)
🔹 جاوا ۲۳ – قالبهای رشتهای (String Templates)، مقادیر دامنهدار (Scoped Values)، همزمانی ساختاریافته (پیشنمایش دوم)
🔹 جاوا ۲۴ – API فایل کلاس، جمعآورندههای Stream، کلاسهای تعریفشده ضمنی
💡 چه در حال آمادهسازی برای مصاحبه باشید، چه در حال مدرنسازی کدهای قدیمی یا کشف قابلیتهای جدید، این مرجع همیشه شما را بهروز نگه میدارد!
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🔵 ترکیب static final در جاوا – ایجاد ثابتهای سراسری (Global Constants)
در جاوا، وقتی از دو کلمهی کلیدی static و final به صورت ترکیبی استفاده میکنیم، با مفهومی بسیار پرکاربرد روبرو هستیم: ثابت سراسری (global constant).
اما دقیقاً این یعنی چه؟ و چه کاربردی در طراحی برنامهها دارد؟ بیایید دقیق و با مثال بررسی کنیم.
🔹 چرا `static`؟
وقتی یک متغیر را static تعریف میکنیم، دیگر آن متعلق به شیء (object) نیست، بلکه متعلق به خود کلاس است. یعنی برای دسترسی به آن نیازی به ساختن نمونه (instance) از کلاس نیست.
🔹 چرا `final`؟
کلمهی final هم باعث میشود مقدار آن متغیر فقط یک بار مقداردهی شود و دیگر نتوان آن را تغییر داد.
✅ ترکیب static final:
وقتی این دو را ترکیب میکنیم، یک متغیر داریم که:
1. متعلق به کلاس است (نه به شیء)
2. مقدارش قابل تغییر نیست (ثابت است)
3. فقط یک بار مقداردهی میشود (معمولاً هنگام تعریف)
📌 مثال واقعی: تعریف ثابتهای جهانی
اکنون میتوان از این ثابتها در هر جای پروژه استفاده کرد:
🔍 تفاوت با متغیرهای عادی چیست؟
فرض کن به جای static final، فقط final گذاشته بودیم:
در این صورت برای استفاده از API_URL، باید از کلاس Config یک شیء بسازی:
ولی وقتی static باشه:
⚠️ نکته مهم در نوشتن نام ثابتها
در جاوا، یک قانون قراردادی وجود دارد که نام ثابتها (یعنی static final ها) را با حروف بزرگ و آندرلاین (_) مینویسند:
🎯 کجا از static final استفاده کنیم؟
* تنظیمات سراسری برنامه
* آدرسهای URL
* کلیدهای ثابت برای فایلها و SharedPreferences
* پیامهای خطای تکراری
* کدهای وضعیت (مثلاً HTTP Code)
در جاوا، وقتی از دو کلمهی کلیدی static و final به صورت ترکیبی استفاده میکنیم، با مفهومی بسیار پرکاربرد روبرو هستیم: ثابت سراسری (global constant).
اما دقیقاً این یعنی چه؟ و چه کاربردی در طراحی برنامهها دارد؟ بیایید دقیق و با مثال بررسی کنیم.
🔹 چرا `static`؟
وقتی یک متغیر را static تعریف میکنیم، دیگر آن متعلق به شیء (object) نیست، بلکه متعلق به خود کلاس است. یعنی برای دسترسی به آن نیازی به ساختن نمونه (instance) از کلاس نیست.
🔹 چرا `final`؟
کلمهی final هم باعث میشود مقدار آن متغیر فقط یک بار مقداردهی شود و دیگر نتوان آن را تغییر داد.
✅ ترکیب static final:
وقتی این دو را ترکیب میکنیم، یک متغیر داریم که:
1. متعلق به کلاس است (نه به شیء)
2. مقدارش قابل تغییر نیست (ثابت است)
3. فقط یک بار مقداردهی میشود (معمولاً هنگام تعریف)
📌 مثال واقعی: تعریف ثابتهای جهانی
public class Config {
public static final String API_URL = "https://api.myapp.com/";
public static final int MAX_LOGIN_ATTEMPTS = 5;
}
اکنون میتوان از این ثابتها در هر جای پروژه استفاده کرد:
System.out.println("URL: " + Config.API_URL);
if (loginAttempts > Config.MAX_LOGIN_ATTEMPTS) {
System.out.println("Too many failed attempts.");
}
🔍 تفاوت با متغیرهای عادی چیست؟
فرض کن به جای static final، فقط final گذاشته بودیم:
public class Config {
public final String API_URL = "https://api.myapp.com/";
}
در این صورت برای استفاده از API_URL، باید از کلاس Config یک شیء بسازی:
Config cfg = new Config();
System.out.println(cfg.API_URL); // غیربهینه و غیرضروری
ولی وقتی static باشه:
System.out.println(Config.API_URL); // ساده و مستقیم
⚠️ نکته مهم در نوشتن نام ثابتها
در جاوا، یک قانون قراردادی وجود دارد که نام ثابتها (یعنی static final ها) را با حروف بزرگ و آندرلاین (_) مینویسند:
public static final String DATABASE_NAME = "main.db";
🎯 کجا از static final استفاده کنیم؟
* تنظیمات سراسری برنامه
* آدرسهای URL
* کلیدهای ثابت برای فایلها و SharedPreferences
* پیامهای خطای تکراری
* کدهای وضعیت (مثلاً HTTP Code)
#کاربرـپیشرفته
🆔 @javapro_ir
🆔 @group_javapro
👍8😍3
🔹 درک تفاوت final و effectively final در جاوا
در نسخههای جدید جاوا (از Java 8 به بعد)، مفهومی به نام effectively final معرفی شد که درک آن برای کار با Lambdaها و inner class ها ضروری است.
✅ متغیر final:
یعنی متغیری که صراحتاً با کلمهی final تعریف شده و مقدارش پس از مقداردهی اولیه دیگر قابل تغییر نیست.
✅ متغیر effectively final:
یعنی متغیری که کلمهی final ندارد، اما در عمل (effectively) فقط یکبار مقداردهی شده و دیگر تغییر نکرده است. جاوا اجازه میدهد از این متغیرها داخل لامبداها استفاده شود، حتی اگر کلمهی final را نداشته باشند.
🔴 اگر مقدار number را تغییر دهیم، دیگر effectively final نیست و استفاده از آن در لامبدا غیرمجاز میشود:
🎯 چرا این محدودیت وجود دارد؟
در Lambdaها و کلاسهای داخلی (inner classes) از طریق closure به متغیرهای خارج از بلاک خود دسترسی پیدا میکنند. برای اینکه اجرای آنها در آینده (و احتمالاً در threadهای دیگر) مشکلی نداشته باشد، جاوا اصرار دارد که فقط به متغیرهایی دسترسی داشته باشند که قابل تغییر نباشند (یعنی final یا effectively final باشند).
🔍 نکته مهم طراحی نرمافزار:
* این ویژگی باعث میشود که لامبداها قابل پیشبینی، thread-safe و بدون side-effect باقی بمانند.
* اگر میخواهی از مقادیر متغیرهای خارجی استفاده کنی ولی نیاز به تغییر آنها داری، باید از آرایه یا کلاس mutable استفاده کنی:
در نسخههای جدید جاوا (از Java 8 به بعد)، مفهومی به نام effectively final معرفی شد که درک آن برای کار با Lambdaها و inner class ها ضروری است.
✅ متغیر final:
یعنی متغیری که صراحتاً با کلمهی final تعریف شده و مقدارش پس از مقداردهی اولیه دیگر قابل تغییر نیست.
final int x = 10;
x = 20; // خطا
✅ متغیر effectively final:
یعنی متغیری که کلمهی final ندارد، اما در عمل (effectively) فقط یکبار مقداردهی شده و دیگر تغییر نکرده است. جاوا اجازه میدهد از این متغیرها داخل لامبداها استفاده شود، حتی اگر کلمهی final را نداشته باشند.
public class Example {
public static void main(String[] args) {
int number = 5; // not declared as final
Runnable r = () -> System.out.println(number); // مجاز چون effectively final است
r.run();
}
}
🔴 اگر مقدار number را تغییر دهیم، دیگر effectively final نیست و استفاده از آن در لامبدا غیرمجاز میشود:
int number = 5;
number++; // اکنون دیگر effectively final نیست
Runnable r = () -> System.out.println(number); // خطای کامپایل
🎯 چرا این محدودیت وجود دارد؟
در Lambdaها و کلاسهای داخلی (inner classes) از طریق closure به متغیرهای خارج از بلاک خود دسترسی پیدا میکنند. برای اینکه اجرای آنها در آینده (و احتمالاً در threadهای دیگر) مشکلی نداشته باشد، جاوا اصرار دارد که فقط به متغیرهایی دسترسی داشته باشند که قابل تغییر نباشند (یعنی final یا effectively final باشند).
🔍 نکته مهم طراحی نرمافزار:
* این ویژگی باعث میشود که لامبداها قابل پیشبینی، thread-safe و بدون side-effect باقی بمانند.
* اگر میخواهی از مقادیر متغیرهای خارجی استفاده کنی ولی نیاز به تغییر آنها داری، باید از آرایه یا کلاس mutable استفاده کنی:
int[] counter = {0};
Runnable r = () -> counter[0]++;
#کاربرـحرفهـای
🆔 @javapro_ir
🆔 @group_javapro
👍5❤2
با جایگزینی REST API با Kafka Streams، ما تأخیر داشبورد را تا ۸۰٪ کاهش دادیم! تجربهای واقعی از ساخت سرویسهای بلادرنگ با Java و Kafka را بخوانید.
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
😍5
🎓 بزودی دوره رایگان Login/Register با توکن در Spring Boot
📢 یه خبر خوب برای دانشجوهای جاواپرو!
یه دورهی کاربردی داریم با موضوع:
🔐 پیادهسازی سیستم ورود/ثبتنام با JWT Token توی Spring Boot
🎯 تو این دوره یاد میگیری:
🧱 ساختار پروژه در Spring Boot و استفاده از RestController
📘 مفاهیم مقدماتی و اولیه اسپرینگ بوت
🔐 امنیت با Spring Security (JwtFilter و UserDetailService)
🧠 نوشتن سرویسهای Login و Register به شکل عملی
📌 پیشنیازها:
👨💻 آشنایی نسبی با زبان Java
⚙️ شناخت ابتدایی از ابزار Maven
💥 این دوره قراره کاملاً رایگان باشه و فقط مخصوص دانشجوهای جاواپرو منتشر میشه!
🔜 منتظر انتشارش باشید...
➡️ اشتراک 👍 لایک 💬 کامنت
📢 یه خبر خوب برای دانشجوهای جاواپرو!
یه دورهی کاربردی داریم با موضوع:
🔐 پیادهسازی سیستم ورود/ثبتنام با JWT Token توی Spring Boot
🎯 تو این دوره یاد میگیری:
🧱 ساختار پروژه در Spring Boot و استفاده از RestController
📘 مفاهیم مقدماتی و اولیه اسپرینگ بوت
🔐 امنیت با Spring Security (JwtFilter و UserDetailService)
🧠 نوشتن سرویسهای Login و Register به شکل عملی
📌 پیشنیازها:
👨💻 آشنایی نسبی با زبان Java
⚙️ شناخت ابتدایی از ابزار Maven
💥 این دوره قراره کاملاً رایگان باشه و فقط مخصوص دانشجوهای جاواپرو منتشر میشه!
🔜 منتظر انتشارش باشید...
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6😍2
شرکت خدمات انفورماتیک، بهعنوان اولین و بزرگترین ارائهدهنده زیرساختها و راهکارهای بانکی در خاورمیانه و تأمینکننده زیرساخت فنی بانک مرکزی جمهوری اسلامی ایران، جهت تکمیل نیروی انسانی خود در موقعیت شغلی "توسعهدهنده جاوا" از افراد واجد شرایط دعوت به همکاری مینماید.
[email protected]
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
ما در بانکینو به دنبال جذب یک توسعهدهنده جاوا (Back-End) باانگیزه و علاقهمند به یادگیری هستیم.
[email protected]
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
مقایسه بین HashMap، Hashtable و ConcurrentHashMap
۱. تفاوت بین HashMap و Hashtable در زبان جاوا چیست؟
۲. آیا HashMap بهصورت پیشفرض ایمن در برابر نخ (Thread-safe) است؟ چگونه میتوان آن را ایمن کرد؟
۳. چرا در کدهای چندنخی، استفاده از ConcurrentHashMap به جای Hashtable توصیه میشود؟
۴. HashMap چگونه برخورد (Collision)های کلید را مدیریت میکند؟
۵. آیا HashMap یا ConcurrentHashMap میتوانند کلید یا مقدار null داشته باشند؟
۱. پیچیدگی زمانی متدهای get() و put() در HashMap در بدترین و میانگین حالت چقدر است؟
۲. HashMap چگونه اندازهی خود را افزایش میدهد و هزینهی این عملیات چیست؟
۳. عملکرد داخلی ConcurrentHashMap در جاوا ۸ نسبت به جاوا ۷ چگونه است؟
۴. منظور از Lock Striping در ConcurrentHashMap چیست و چگونه باعث بهبود همزمانی میشود؟
۵. آیا ConcurrentHashMap برای عملیات ترکیبی مانند putIfAbsent، رفتار اتمی را تضمین میکند؟
۶. سطوح همزمانی در ConcurrentHashMap چه هستند و چه تأثیری بر عملکرد دارند؟
۷. تفاوت بین Collections.synchronizedMap() و ConcurrentHashMap چیست؟
۸. رفتار fail-fast در HashMap چگونه عمل میکند و در مقابل، ConcurrentHashMap چگونه fail-safe است؟
۹. آیا تغییر در ConcurrentHashMap حین پیمایش (iteration) ایمن است؟ چرا؟
۱۰. ضریب بار (Load Factor) در HashMap چه تأثیری بر عملکرد و مصرف حافظه دارد؟
۱۱. از جاوا ۸ به بعد، HashMap از چه ساختار دادهای برای باکتها استفاده میکند؟
۱۲. تأثیر تغییرناپذیری کلید (Immutable Key) در HashMap چیست؟ چرا کلید باید غیرقابل تغییر باشد؟
۱۳. تفاوت بین متدهای compute()، computeIfAbsent() و merge() در ConcurrentHashMap چیست؟
۱۴. چرا ConcurrentHashMap اجازهی استفاده از کلید یا مقدار null را نمیدهد؟
۱۵. طراحی یک Map ایمن برای نخ چگونه انجام میشود؟ چه راهحلی برای قفلگذاری و مقیاسپذیری پیشنهاد میکنید؟
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
🎯 ما در دیجیکالا به دنبال جذب همکار برای دو موقعیت زیر هستیم:
🔹 توسعهدهنده ارشد فرانتاند (Senior Frontend Engineer)
🔹 توسعهدهنده ارشد نرمافزار (Senior Software Engineer)
این موقعیتها در هسته اصلی تیم تکنولوژی دیجیکالا قرار دارند و قراره با هم روی یک پروژه جذاب و بزرگ کار کنیم.
میتونید رزومه خودتون رو به آدرس ایمیل زیر ارسال کنید:
[email protected]
یا از طریق لینکهای زیر بهصورت مستقیم اپلای کنید:
🔗 فرانتاند:
https://careers.digikala.com/job-positions/2702/
🔗 بکاند:
https://careers.digikala.com/job-positions/2700/
📢 اگر کسی رو میشناسید که این موقعیتها میتونه براش جذاب باشه، حتماً این پست رو براش بفرستید.
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
دوستان و همکاران ارجمند،
در یکی از تیمهای نرمافزاری شرکت شاپرک، به یک توسعهدهنده جاوا با شرایط زیر نیازمندیم:
---
🎯 ویژگیهای فردی مورد انتظار:
---
IoC، AOP، Security، JPA، Boot
---
در صورت علاقهمندی، لطفاً رزومه خود را به آدرس زیر ارسال فرمایید:
[email protected]
---
تیمپذیری برای ما اهمیت بالایی دارد.
ترجیح ما داشتن بین ۳ تا ۵ سال سابقه کاری است، اما اگر سابقهی کمتری دارید ولی دانش خوبی دارید، حتماً رزومه خود را ارسال کنید.
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
ما در سیموتک به دنبال جذب چند برنامهنویس توانمند Java با تمرکز بر Spring Framework هستیم.
---
مهارت فنی برای ما مهمتر از تعداد سالهای سابقه کار است.
اگر توانمند هستی، حتماً رزومهات رو برامون بفرست!
---
---
---
تهران، خیابان کریمخان، خیابان خردمند
تماموقت – فقط بهصورت حضوری
---
لطفاً رزومه خود را به آدرس زیر ارسال نمایید:
[email protected]
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
از نسخه IntelliJ IDEA 2025.3 به بعد، شرکت JetBrains نسخههای Community و Ultimate این ابزار را در قالب یک محصول واحد مبتنی بر اشتراک عرضه میکند — و بسیاری از قابلیتهای قدرتمند نسخه Ultimate را بهصورت رایگان در دسترس قرار میدهد!
این حرکت یک موفقیت بزرگ برای دسترسپذیری، بهرهوری و کل اکوسیستم جاوا محسوب میشود.
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🗿1