🔹 درک مفهوم Closure در زبان جاوا
در برنامهنویسی، Closure به سازهای گفته میشود که میتواند به متغیرهای محدودهی خارجی خود (enclosing scope) دسترسی داشته باشد، حتی پس از پایان عمر آن محدوده.
در زبانهایی مانند JavaScript، closure ها بسیار رایج هستند. اما در جاوا از نسخه ۸ به بعد با معرفی Lambda Expressions، امکان استفاده از Closure نیز فراهم شد.
✅ در جاوا Closure چگونه کار میکند؟
با مثالی شروع کنیم:
در اینجا:
متغیر base خارج از لامبدا تعریف شده.
لامبدا (value) -> value + base از این متغیر استفاده میکند.
با این کار، لامبدا به همراه محیطی که به آن نیاز دارد، بستهبندی میشود (همان Closure).
🔒 نکته مهم اینجاست که base باید effectively final باشد. یعنی بعد از مقداردهی اولیه تغییر نکند. در غیر این صورت کامپایل نمیشود:
🎯 کاربرد Closure در جاوا چیست؟
در واقع Closureها به شما اجازه میدهند که تابعهایی بسازید که به وضعیت محیط اطراف خود دسترسی دارند، حتی اگر آن محیط دیگر در stack موجود نباشد. این ویژگی بسیار مفید است در موارد زیر:
زمانی که میخواهید یک تابع تولید کنید که بسته به مقداری خاص رفتار کند.
زمانی که میخواهید دادههایی را داخل یک تابع "به خاطر بسپارید".
✅ یک مثال واقعیتر: تولید کننده ضربکننده (Multiplier Generator)
در این مثال:
هر لامبدا به مقدار factor که در زمان ساخت دریافت کرده دسترسی دارد.
این یعنی لامبدا به همراه محیطش (factor) بستهبندی شده و به عنوان Closure عمل میکند.
🔚 جمعبندی
در جاوا، لامبداهایی که به متغیرهای خارجی دسترسی دارند، Closure هستند.
این متغیرها باید final یا effectively final باشند.
استفاده از Closure باعث میشود توابعی با رفتار وابسته به محیط بسازید، که در طراحی توابع انعطافپذیر بسیار مفید است.
در برنامهنویسی، Closure به سازهای گفته میشود که میتواند به متغیرهای محدودهی خارجی خود (enclosing scope) دسترسی داشته باشد، حتی پس از پایان عمر آن محدوده.
در زبانهایی مانند JavaScript، closure ها بسیار رایج هستند. اما در جاوا از نسخه ۸ به بعد با معرفی Lambda Expressions، امکان استفاده از Closure نیز فراهم شد.
✅ در جاوا Closure چگونه کار میکند؟
با مثالی شروع کنیم:
public class ClosureExample {
public static void main(String[] args) {
int base = 10;
Function<Integer, Integer> adder = (value) -> value + base;
System.out.println(adder.apply(5)); // خروجی: 15
}
}
در اینجا:
متغیر base خارج از لامبدا تعریف شده.
لامبدا (value) -> value + base از این متغیر استفاده میکند.
با این کار، لامبدا به همراه محیطی که به آن نیاز دارد، بستهبندی میشود (همان Closure).
🔒 نکته مهم اینجاست که base باید effectively final باشد. یعنی بعد از مقداردهی اولیه تغییر نکند. در غیر این صورت کامپایل نمیشود:
int base = 10;
base++; // باعث خطا میشود
Function<Integer, Integer> adder = (value) -> value + base;
🎯 کاربرد Closure در جاوا چیست؟
در واقع Closureها به شما اجازه میدهند که تابعهایی بسازید که به وضعیت محیط اطراف خود دسترسی دارند، حتی اگر آن محیط دیگر در stack موجود نباشد. این ویژگی بسیار مفید است در موارد زیر:
زمانی که میخواهید یک تابع تولید کنید که بسته به مقداری خاص رفتار کند.
زمانی که میخواهید دادههایی را داخل یک تابع "به خاطر بسپارید".
✅ یک مثال واقعیتر: تولید کننده ضربکننده (Multiplier Generator)
public class MultiplierFactory {
public static Function<Integer, Integer> createMultiplier(int factor) {
return (value) -> value * factor;
}
public static void main(String[] args) {
Function<Integer, Integer> timesTwo = createMultiplier(2);
Function<Integer, Integer> timesThree = createMultiplier(3);
System.out.println(timesTwo.apply(5)); // خروجی: 10
System.out.println(timesThree.apply(5)); // خروجی: 15
}
}
در این مثال:
هر لامبدا به مقدار factor که در زمان ساخت دریافت کرده دسترسی دارد.
این یعنی لامبدا به همراه محیطش (factor) بستهبندی شده و به عنوان Closure عمل میکند.
🔚 جمعبندی
در جاوا، لامبداهایی که به متغیرهای خارجی دسترسی دارند، Closure هستند.
این متغیرها باید final یا effectively final باشند.
استفاده از Closure باعث میشود توابعی با رفتار وابسته به محیط بسازید، که در طراحی توابع انعطافپذیر بسیار مفید است.
#کاربرـحرفهـای
🆔 @javapro_ir
🆔 @group_javapro
👍4❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
نسخه جدید بر پایه Spring Framework 7 ساخته شده و ۱۱ تغییر بزرگ را به همراه دارد؛ از کنترل نسخه API و تزریق Bean منعطف گرفته تا Null-Safety پیشرفته و ایجاد آسان HTTP Proxy.
پشتیبانی از GraalVM Native، ارتقاء به Jackson 3.x و بهبودهای Servlet/WebSocket فقط بخشی از این تغییرات است.
در این مقاله همه جزئیات فنی و کدهای نمونه را مرور کردهایم تا مسیر مهاجرت شما سادهتر شود.
⚡️ @javapro_ir✈️ @group_javapro
#اسپرینگ_بوت4 #SpringBoot4 #برنامه_نویسی_جاوا #JavaProgramming #SpringFramework7 #راهنمای_اسپرینگ_بوت #SpringBootGuide #آموزش_اسپرینگ_بوت #SpringBootTutorial
Please open Telegram to view this post
VIEW IN TELEGRAM
ما به دنبال یک توسعهدهنده ارشد جاوا با تجربه در سیستمهای میکروسرویس، مسلط به Spring Boot و پایگاهدادههای SQL و NoSQL هستیم تا به تیم فنی پویا و چابک ما بپیوندد.
تسلط کامل به Java و Spring Boot
تجربه طراحی، پیادهسازی و بهینهسازی سیستمهای توزیعشده
توانایی تحلیل و حل مسئله در حوزه Backend
آشنایی با اصول OOP و معماری Microservice
تجربه کار با Docker
تسلط بر پایگاهدادههای SQL و NoSQL (مانند Elasticsearch)
آشنایی با MQها بهخصوص Kafka
مهارت در نوشتن Unit Test و تستهای عملکرد
آشنایی با دادههای بلادرنگ و WebSocket (مزیت محسوب میشود)
آشنایی با استانداردهای امنیتی و مفاهیم رمزنگاری
تجربه کار با GitLab و فرآیندهای CI/CD
توانایی همکاری مؤثر در تیمهای Agile و بینتیمی (مثل تیمهای AI و Front-End)
مشاهده منبع آگهی
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🚀 فرصت شغلی بینالمللی برای برنامهنویسان
💵 حقوق ماهانه 3 تا 5 هزار دلار بستگی به سطح مهارت
📈 امکان افزایش قابلتوجه درآمد از طریق همکاری همزمان در چند پروژه مشتری.
یک شرکت معتبر آمریکایی فعال در حوزه فناوری اطلاعات به دنبال جذب برنامهنویسان متخصص از سراسر جهان است.
اگر به یکی از زبانهای برنامهنویسی زیر مسلط هستید و انگلیسی شما در سطح بالا است، این میتواند شروع همکاری شما در پروژههای بینالمللی باشد.
✅ شرایط مورد نیاز:
تسلط به یکی از زبانهای برنامهنویسی (حداقل ۵ سال سابقه):
PHP، Java، C#، Python، Ruby یا JavaScript
سطح زبان انگلیسی C1 یا بالاتر
آمادگی برای کار در محیطهای دورکاری و ارتباط مستقیم با مشتریان بینالمللی
💼 مزایا:
همکاری پروژهای و بلندمدت
امکان مشارکت در چند پروژه همزمان
دریافت پاداش عملکرد
💬 فرآیند جذب:
مصاحبهها به زبان انگلیسی انجام میشوند
شامل ارزیابی اولیه و مصاحبه فنی
📍 ارسال درخواست:
📄 فرم ثبتنام را اینجا تکمیل کنید
➡️ اشتراک 👍 لایک 💬 کامنت
یک شرکت معتبر آمریکایی فعال در حوزه فناوری اطلاعات به دنبال جذب برنامهنویسان متخصص از سراسر جهان است.
اگر به یکی از زبانهای برنامهنویسی زیر مسلط هستید و انگلیسی شما در سطح بالا است، این میتواند شروع همکاری شما در پروژههای بینالمللی باشد.
تسلط به یکی از زبانهای برنامهنویسی (حداقل ۵ سال سابقه):
PHP، Java، C#، Python، Ruby یا JavaScript
سطح زبان انگلیسی C1 یا بالاتر
آمادگی برای کار در محیطهای دورکاری و ارتباط مستقیم با مشتریان بینالمللی
همکاری پروژهای و بلندمدت
امکان مشارکت در چند پروژه همزمان
دریافت پاداش عملکرد
مصاحبهها به زبان انگلیسی انجام میشوند
شامل ارزیابی اولیه و مصاحبه فنی
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
با استفاده از ترفندهای کاربردی ChatGPT، میتوانید زمان کدنویسی، دیباگ و نوشتن تستهای واحد خود را بهطور چشمگیری کاهش دهید. برای آشنایی با این ترفندها و بهرهبرداری از آنها، مقاله زیر کامل را مطالعه کنید:
⚡️ @javapro_ir✈️ @group_javapro
#ترفندهای_جاوا #ChatGPT #برنامه_نویسی #دیباگ #تست_واحد #کدنویسی_سریع #SpringBoot #استثناهای_سفارشی #API #JPA #کد_تمیز #بهینه_سازی_کد #توسعه_دهنده_جاوا
Please open Telegram to view this post
VIEW IN TELEGRAM
💯2
🔹 درک تفاوت Heap و Stack در حافظه جاوا
در زبان جاوا، مدیریت حافظه توسط Java Virtual Machine (JVM) انجام میشود. دو بخش اصلی حافظه که بیشترین اهمیت را در درک رفتار برنامهها دارند عبارتاند از: Heap و Stack. شناخت این دو ناحیه برای بهینهسازی عملکرد و جلوگیری از خطاهای حافظه ضروری است.
حافظه Stack
حافظه Stack برای ذخیرهسازی دادههای موقتی و محلی استفاده میشود:
هر بار که یک متد فراخوانی میشود، یک Stack Frame ایجاد میشود که شامل متغیرهای محلی، آدرس بازگشت و دادههای موقتی است.
دادهها در Stack به صورت LIFO (آخر وارد، اول خارج) مدیریت میشوند.
پس از اتمام اجرای متد، Stack Frame آن به طور خودکار آزاد میشود.
📌 ویژگیها:
سرعت بسیار بالا به دلیل تخصیص و آزادسازی خودکار.
حجم محدود (در صورت پر شدن → StackOverflowError).
حافظه Heap
حافظه Heap برای ذخیرهسازی اشیاء (Objects) استفاده میشود:
تمام اشیاء ایجاد شده با new در Heap قرار میگیرند.
دسترسی به این اشیاء از طریق رفرنسها انجام میشود که خود رفرنس معمولاً در Stack ذخیره میشود.
مدیریت آزادسازی حافظه در Heap بر عهده Garbage Collector است.
📌 ویژگیها:
مناسب برای دادههایی که طول عمرشان بیشتر از یک فراخوانی متد است.
سرعت کمتر نسبت به Stack به دلیل مدیریت پیچیدهتر حافظه.
مثال عملی
در این مثال:
localVariable و person (به عنوان رفرنس) در Stack ذخیره میشوند.
شیء Person("Ali") در Heap ایجاد میشود.
رشته "Sara" در String Pool ذخیره میشود که بخشی از Heap است.
خطاهای رایج مرتبط با این دو حافظه
1. StackOverflowError:
زمانی که عمق بازگشتی متدها بیش از حد مجاز شود، مانند:
2. OutOfMemoryError: Java heap space:
زمانی که اشیاء زیادی ایجاد شوند و حافظه Heap پر شود.
📌 جمعبندی
Stack: برای دادههای محلی و اجرای متدها، سریع ولی محدود.
Heap: برای اشیاء و دادههای طولانیمدت، انعطافپذیر ولی کندتر.
درک درست این دو فضا به بهینهسازی حافظه و جلوگیری از خطا کمک میکند.
در زبان جاوا، مدیریت حافظه توسط Java Virtual Machine (JVM) انجام میشود. دو بخش اصلی حافظه که بیشترین اهمیت را در درک رفتار برنامهها دارند عبارتاند از: Heap و Stack. شناخت این دو ناحیه برای بهینهسازی عملکرد و جلوگیری از خطاهای حافظه ضروری است.
حافظه Stack
حافظه Stack برای ذخیرهسازی دادههای موقتی و محلی استفاده میشود:
هر بار که یک متد فراخوانی میشود، یک Stack Frame ایجاد میشود که شامل متغیرهای محلی، آدرس بازگشت و دادههای موقتی است.
دادهها در Stack به صورت LIFO (آخر وارد، اول خارج) مدیریت میشوند.
پس از اتمام اجرای متد، Stack Frame آن به طور خودکار آزاد میشود.
📌 ویژگیها:
سرعت بسیار بالا به دلیل تخصیص و آزادسازی خودکار.
حجم محدود (در صورت پر شدن → StackOverflowError).
حافظه Heap
حافظه Heap برای ذخیرهسازی اشیاء (Objects) استفاده میشود:
تمام اشیاء ایجاد شده با new در Heap قرار میگیرند.
دسترسی به این اشیاء از طریق رفرنسها انجام میشود که خود رفرنس معمولاً در Stack ذخیره میشود.
مدیریت آزادسازی حافظه در Heap بر عهده Garbage Collector است.
📌 ویژگیها:
مناسب برای دادههایی که طول عمرشان بیشتر از یک فراخوانی متد است.
سرعت کمتر نسبت به Stack به دلیل مدیریت پیچیدهتر حافظه.
مثال عملی
public class MemoryExample {
public static void main(String[] args) {
int localVariable = 5; // ذخیره در Stack
Person person = new Person("Ali"); // رفرنس در Stack، شیء در Heap
methodExample();
}
static void methodExample() {
String name = "Sara"; // رشته Immutable، در String Pool (بخشی از Heap)
int number = 42; // در Stack
}
}
class Person {
String name;
Person(String name) {
this.name = name;
}
}
در این مثال:
localVariable و person (به عنوان رفرنس) در Stack ذخیره میشوند.
شیء Person("Ali") در Heap ایجاد میشود.
رشته "Sara" در String Pool ذخیره میشود که بخشی از Heap است.
خطاهای رایج مرتبط با این دو حافظه
1. StackOverflowError:
زمانی که عمق بازگشتی متدها بیش از حد مجاز شود، مانند:
public void recursive() {
recursive();
}
2. OutOfMemoryError: Java heap space:
زمانی که اشیاء زیادی ایجاد شوند و حافظه Heap پر شود.
📌 جمعبندی
Stack: برای دادههای محلی و اجرای متدها، سریع ولی محدود.
Heap: برای اشیاء و دادههای طولانیمدت، انعطافپذیر ولی کندتر.
درک درست این دو فضا به بهینهسازی حافظه و جلوگیری از خطا کمک میکند.
#کاربرـحرفهـای
🆔 @javapro_ir
🆔 @group_javapro
❤6👍6👾2🎉1💯1
پیش از ورود به مبحث DSA، لازم است پایههای خود را در زبان جاوا تقویت کنید:
۱. تسلط بر مفاهیم برنامهنویسی شیءگرا شامل Abstraction، Encapsulation، Inheritance و Polymorphism
۲. آشنایی با Collections Framework شامل List، Set و Map
۳. یادگیری مدیریت استثناها (Exception Handling)
۴. تمرین کار با Java Streams و Lambda Expressions
۵. توانایی نوشتن کد تمیز، ماژولار و قابل تست
آرایهها و رشتهها:
۱. پیدا کردن بیشترین مجموع یک زیرآرایه
۲. یافتن تمام زیررشتههایی که پالیندروم هستند
۳. پیادهسازی مسئله «دو جمع» (Two Sum)
۴. پیادهسازی الگوریتم Kadane برای بیشترین مجموع زیرآرایه
۵. پیدا کردن عدد گمشده در یک آرایه از اعداد صحیح
۶. ادغام دو آرایه مرتب در یک آرایه مرتب
۷. بررسی اینکه آیا یک رشته پالیندروم است یا نه
۸. یافتن اولین کاراکتر غیرتکراری در یک رشته
۹. حذف عناصر تکراری از یک آرایه مرتب
لیستهای پیوندی:
۱۰. برعکس کردن یک لیست پیوندی
۱۱. شناسایی حلقه در لیست پیوندی
۱۲. پیدا کردن عنصر میانی یک لیست پیوندی
۱۳. ادغام دو لیست پیوندی مرتب
۱۴. پیادهسازی پشته با استفاده از لیست پیوندی
۱۵. یافتن نقطه اشتراک دو لیست پیوندی
پشتهها و صفها:
۱۶. پیادهسازی پشته با آرایه
۱۷. پیادهسازی پشتهای که عملیات push، pop، top و بازیابی حداقل عنصر را انجام دهد
۱۸. پیادهسازی صف حلقهای (Circular Queue)
۱۹. طراحی پشتهای که عملیات push، pop، top و بازیابی بیشترین عنصر را پشتیبانی کند
۲۰. طراحی صف با استفاده از پشتهها
درختها و درختهای جستجوی دودویی:
۲۱. یافتن ارتفاع یک درخت دودویی
۲۲. یافتن کمترین اجداد مشترک دو گره در یک درخت دودویی
۲۳. بررسی اینکه آیا یک درخت دودویی یک درخت جستجوی دودویی معتبر است یا نه
۲۴. سریالسازی و دیسریالسازی یک درخت دودویی
۲۵. پیادهسازی پیمایش Inorder در یک درخت دودویی
۲۶. یافتن قطر یک درخت دودویی
۲۷. تبدیل یک درخت دودویی به آینه آن
گرافها:
۲۸. پیادهسازی جستجوی عمقی (DFS)
۲۹. پیادهسازی جستجوی سطحی (BFS)
۳۰. یافتن کوتاهترین مسیر بین دو گره در یک گراف بدون وزن
۳۱. شناسایی حلقه در یک گراف بدون جهت با استفاده از DFS
۳۲. بررسی دوبخشی بودن یک گراف (Bipartite)
۳۳. یافتن تعداد مؤلفههای همبند در یک گراف بدون جهت
۳۴. یافتن پلها (Bridges) در یک گراف
مرتبسازی و جستجو:
۳۵. پیادهسازی مرتبسازیهای حبابی، درجی، انتخابی و ادغامی (Bubble, Insertion, Selection, Merge Sort)
۳۶. پیادهسازی مرتبسازی سریع (Quicksort)
۳۷. پیادهسازی جستجوی دودویی (Binary Search)
۳۸. پیادهسازی جستجوی درونیابی (Interpolation Search)
۳۹. یافتن kامین عنصر کوچکتر در یک آرایه
۴۰. شمارش تعداد وارونگیها (Inversions) در یک آرایه — وارونگی زمانی رخ میدهد که دو عنصر نسبت به ترتیب صحیح جابهجا باشند
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
RESTful API.pdf
943.4 KB
آشنایی با RESTful API در Java
در این PDF به صورت خلاصه و کلی با RESTful API در زبان Java آشنا میشوید.
➡️ اشتراک 👍 لایک 💬 کامنت
#جاوا #java #restful
در این PDF به صورت خلاصه و کلی با RESTful API در زبان Java آشنا میشوید.
⚡️ @javapro_ir✈️ @group_javapro
#جاوا #java #restful
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😍3
✨ مسیر واقعی موفقیت ✨
نه یک خط صافه⛔
نه شانس🍀
نه جادو✨ 🧞♂
مسیرش اینه:
🧠 فکر کن →
🔍 امتحان کن →
💪 انجام بده →
❌ شکست بخور →
📚 یاد بگیر →
🔄 دوباره امتحان کن →
🚀 دوباره انجام بده →
⏳ ادامه بده…
و یک روز…✅ موفقیت
✅ موفقیت به معنای بینقص بودن نیست
✅ یعنی حفظ شتاب و حرکت
✅ یعنی آجر به آجر ساختن با پشتکار
❓ امروز تو کجای این مسیر هستی؟
👇 توی کامنتها بگو
➡️ اگه موافقی پست رو بازنشر کن
➡️ اشتراک 👍 لایک 💬 کامنت
نه یک خط صافه
نه شانس
نه جادو
مسیرش اینه:
و یک روز…
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 در جاوا Varargs چیست
🔹در جاوا Varargs یا Variable Arguments به شما اجازه میدهد که به یک متد، تعداد نامحدود آرگومان از یک نوع خاص بدهید، بدون اینکه مجبور باشید آرایه را به صورت دستی ایجاد کنید.
📖 تعریف
در جاوا، اگر بخواهید یک متد تعداد متغیری از آرگومانها را بگیرد، از سه نقطه (...) بعد از نوع داده استفاده میکنید:
📌 این یعنی متد printNumbers میتواند:
⚡ نکات مهم
1. فقط یک پارامتر Varargs میتواند وجود داشته باشد و باید آخرین پارامتر متد باشد:
2. در پشتصحنه، Varargs یک آرایه میسازد.
3. میتوان متد را با هیچ آرگومانی هم صدا زد.
💡 مثال متنوع
جمع اعداد با Varargs:
📌 مزیت: سادهتر و خواناتر از تعریف چند متد Overload شده.
🚫 عیب: استفاده بیشازحد ممکن است کد را مبهم کند.
✍️ خلاصه:
در جاوا Varargs یعنی "به جای اینکه بگی چند تا پارامتر، بگو هر چند تا خواستی!" و جاوا خودش آنها را داخل یک آرایه میریزد.
🔹در جاوا Varargs یا Variable Arguments به شما اجازه میدهد که به یک متد، تعداد نامحدود آرگومان از یک نوع خاص بدهید، بدون اینکه مجبور باشید آرایه را به صورت دستی ایجاد کنید.
📖 تعریف
در جاوا، اگر بخواهید یک متد تعداد متغیری از آرگومانها را بگیرد، از سه نقطه (...) بعد از نوع داده استفاده میکنید:
public void printNumbers(int... numbers) {
for (int num : numbers) {
System.out.print(num + " ");
}
}
📌 این یعنی متد printNumbers میتواند:
printNumbers(1, 2, 3);
printNumbers(10, 20, 30, 40, 50);
printNumbers(); // حتی بدون هیچ آرگومانی
⚡ نکات مهم
1. فقط یک پارامتر Varargs میتواند وجود داشته باشد و باید آخرین پارامتر متد باشد:
public void example(String name, int... scores) { }
2. در پشتصحنه، Varargs یک آرایه میسازد.
3. میتوان متد را با هیچ آرگومانی هم صدا زد.
💡 مثال متنوع
جمع اعداد با Varargs:
public class VarargsExample {
public static int sum(int... numbers) {
int total = 0;
for (int num : numbers) {
total += num;
}
return total;
}
public static void main(String[] args) {
System.out.println(sum(1, 2, 3)); // خروجی: 6
System.out.println(sum(10, 20)); // خروجی: 30
System.out.println(sum()); // خروجی: 0
}
}
📌 مزیت: سادهتر و خواناتر از تعریف چند متد Overload شده.
🚫 عیب: استفاده بیشازحد ممکن است کد را مبهم کند.
✍️ خلاصه:
در جاوا Varargs یعنی "به جای اینکه بگی چند تا پارامتر، بگو هر چند تا خواستی!" و جاوا خودش آنها را داخل یک آرایه میریزد.
#کاربرـحرفهـای
🆔 @javapro_ir
🆔 @group_javapro
👍9😍3❤2👾2
نمودار تکامل فناوریهای پایگاه داده در جاوا 🚀
دسترسی به پایگاه داده در جاوا – از JDBC تا Spring Data JPA
سفر دسترسی به پایگاه داده در اکوسیستم جاوا مسیری بسیار جذاب بوده است.
آغاز کار با JDBC بود؛ جایی که هر دستور SQL باید بهصورت دستی نوشته میشد و مدیریت منابع نیز به شکل دستی انجام میگرفت.
پس از آن، مفهوم ORM (Object-Relational Mapping) مطرح شد که پلی میان Java Objects و Database Tables ایجاد میکرد.
📌 خط زمانی تکامل:
سال ۱۹۹۹ – JDBC → اجرای مستقیم SQL، مدیریت دستی
سال ۲۰۰۲ – ORM Concept → ایدهی نگاشت Object ↔ Table
سال ۲۰۰۴ – Hibernate → ابزار ORM، لایهی Wrapper روی JDBC
سال ۲۰۰۶ – JPA (Java Persistence API) → مشخصهی رسمی ORM (بهصورت API)
سال ۲۰۱۲ – Spring JDBC → سادهسازی دسترسی JDBC از طریق Spring
سال ۲۰۱۲ به بعد – Spring Data JPA → انتزاع سطح بالا روی JPA
زمان حال – Hibernate همراه با JPA → تأمینکنندهی پیشفرض JPA در Spring Boot
امروزه در پروژههای Spring Boot، معمولاً از Spring Data JPA استفاده میشود؛
اما در لایههای زیرین، ترکیب JPA API + Hibernate (Implementation) + JDBC مسئول انجام عملیات اصلی پایگاه داده هستند.
💡 جریان کاری (Flow):
Spring Data JPA → JPA API → Hibernate (JPA Implementation) → JDBC → Database
دسترسی به پایگاه داده در جاوا – از JDBC تا Spring Data JPA
سفر دسترسی به پایگاه داده در اکوسیستم جاوا مسیری بسیار جذاب بوده است.
آغاز کار با JDBC بود؛ جایی که هر دستور SQL باید بهصورت دستی نوشته میشد و مدیریت منابع نیز به شکل دستی انجام میگرفت.
پس از آن، مفهوم ORM (Object-Relational Mapping) مطرح شد که پلی میان Java Objects و Database Tables ایجاد میکرد.
📌 خط زمانی تکامل:
سال ۱۹۹۹ – JDBC → اجرای مستقیم SQL، مدیریت دستی
سال ۲۰۰۲ – ORM Concept → ایدهی نگاشت Object ↔ Table
سال ۲۰۰۴ – Hibernate → ابزار ORM، لایهی Wrapper روی JDBC
سال ۲۰۰۶ – JPA (Java Persistence API) → مشخصهی رسمی ORM (بهصورت API)
سال ۲۰۱۲ – Spring JDBC → سادهسازی دسترسی JDBC از طریق Spring
سال ۲۰۱۲ به بعد – Spring Data JPA → انتزاع سطح بالا روی JPA
زمان حال – Hibernate همراه با JPA → تأمینکنندهی پیشفرض JPA در Spring Boot
امروزه در پروژههای Spring Boot، معمولاً از Spring Data JPA استفاده میشود؛
اما در لایههای زیرین، ترکیب JPA API + Hibernate (Implementation) + JDBC مسئول انجام عملیات اصلی پایگاه داده هستند.
💡 جریان کاری (Flow):
Spring Data JPA → JPA API → Hibernate (JPA Implementation) → JDBC → Database
🙏3👍1
اگر سالها با Java کار کرده باشید، احتمالاً فکر میکنید همه چیز را میدانید — ترفندها، نکات و حتی مشکلات پنهان. اما جاوا مثل یک همکار قدیمی است؛ درست وقتی فکر میکنید او را کاملاً میشناسید، نکتهای جدید رو میکند که نگاهتان را تغییر میدهد.در اینجا چند واقعیت کمتر شناختهشده از جاوا را میبینید که حتی توسعهدهندگان باتجربه را هم غافلگیر میکند. اگر برای مصاحبهی شغلی آماده میشوید یا میخواهید مهارت جاوای خود را ارتقا دهید، این لیست به شما کمک خواهد کرد.
در جاوا، شما میتوانید null را به هر Reference Type مثل String یا Integer Cast کنید و Compiler هیچ خطایی نمیدهد. این کاملاً مجاز است — اما اگر بدون بررسی استفاده شود میتواند خطرناک باشد.
public class NullCastingExample {
public static void main(String[] args) {
// null can be cast to any reference type
String text = (String) null;
Integer number = (Integer) null;
// printing values
System.out.println("Text: " + text);
System.out.println("Number: " + number);
}
}
Text: null
Number: null
> اینجا خطای ClassCastException رخ نمیدهد چون شیء واقعی Cast نشده است. مشکل زمانی شروع میشود که متدی روی null فراخوانی کنید و با NullPointerException روبهرو شوید.
2️⃣ امکان داشتن چند متد main در یک کلاس
یک کلاس میتواند چند متد main داشته باشد. اما فقط متدی با امضای دقیق زیر بهعنوان نقطهی شروع برنامه شناخته میشود:
public static void main(String[] args)
بقیهی متدهای main صرفاً متدهای معمولی هستند و میتوانند پارامترهای مختلفی بگیرند.
public class MultiMainExample {
public static void main(String[] args) {
// this is the actual entry point
System.out.println("Main method with String[] args");
// calling the overloaded main method
main(42);
}
// overloaded main method with int parameter
public static void main(int number) {
System.out.println("Main method with int: " + number);
}
}
Main method with String[] args
Main method with int: 42
3️⃣ تفاوت عملگر == در مقایسهی String ها
عملگر == در جاوا برای مقایسهی Reference Equality (برابری آدرس حافظه) استفاده میشود. اما در مورد String Literals، به دلیل String Interning ممکن است گمراهکننده باشد.
public class StringComparison {
public static void main(String[] args) {
// string literals are interned
String a = "Java";
String b = "Java";
// new creates a separate object in the heap
String c = new String("Java");
// comparing references (true, same interned literal)
System.out.println(a == b);
// comparing references (false, different objects)
System.out.println(a == c);
// comparing actual values (true, values are equal)
System.out.println(a.equals(c));
}
}
اگر به اشتباه برای مقایسهی رشتهها از == استفاده کنید، ممکن است دچار باگهای ظریف شوید — مخصوصاً وقتی رشتهها بهصورت پویا ساخته میشوند. همیشه برای مقایسهی مقدار رشته از equals() استفاده کنید.
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🔹جلوگیری از NullPointerException با استفاده از Optional
یکی از خطاهای رایج در جاوا، استثنای معروف NullPointerException است. برای مقابله با این مشکل، از کلاس Optional که از جاوا 8 معرفی شد، استفاده میکنیم.
✅ کاربرد اصلی Optional:
این کلاس به ما کمک میکند مقادیری که ممکن است null باشند را در یک ظرف (Container) قرار دهیم و هنگام استفاده، بهصورت امن بررسی کنیم.
📌 مثال ساده بدون Optional:
📌 همان مثال با Optional:
🔍 روشهای مهم کار با Optional
1️⃣ ایجاد Optional
2️⃣ بررسی مقدار
3️⃣ استفاده از orElse / orElseGet
4️⃣ استفاده از ifPresent
5️⃣ استفاده از map برای تغییر مقدار
✨ نتیجهگیری:
با استفاده از Optional، کد ما تمیزتر و ایمنتر میشود و میتوانیم جلوی بسیاری از خطاهای NullPointerException را بگیریم.
یکی از خطاهای رایج در جاوا، استثنای معروف NullPointerException است. برای مقابله با این مشکل، از کلاس Optional که از جاوا 8 معرفی شد، استفاده میکنیم.
✅ کاربرد اصلی Optional:
این کلاس به ما کمک میکند مقادیری که ممکن است null باشند را در یک ظرف (Container) قرار دهیم و هنگام استفاده، بهصورت امن بررسی کنیم.
📌 مثال ساده بدون Optional:
public class User {
private String name;
public String getName() {
return name;
}
}
public class Test {
public static void main(String[] args) {
User user = null;
// اینجا خطای NullPointerException رخ میدهد
System.out.println(user.getName());
}
}
📌 همان مثال با Optional:
import java.util.Optional;
public class Test {
public static void main(String[] args) {
Optional<String> name = Optional.ofNullable(null);
// اگر مقدار null باشد، "Unknown" چاپ میشود
System.out.println(name.orElse("Unknown"));
}
}
🔍 روشهای مهم کار با Optional
1️⃣ ایجاد Optional
Optional<String> opt1 = Optional.of("Hello"); // مقدار حتماً باید غیر null باشد
Optional<String> opt2 = Optional.ofNullable(null); // میتواند null یا غیر null باشد
Optional<String> opt3 = Optional.empty(); // همیشه خالی
2️⃣ بررسی مقدار
if(opt1.isPresent()) {
System.out.println(opt1.get());
}
3️⃣ استفاده از orElse / orElseGet
String value = opt2.orElse("Default Value");
String value2 = opt2.orElseGet(() -> "Generated Value");
4️⃣ استفاده از ifPresent
opt1.ifPresent(v -> System.out.println("Value: " + v));
5️⃣ استفاده از map برای تغییر مقدار
Optional<String> upper = opt1.map(String::toUpperCase);
System.out.println(upper.orElse("No Value"));
✨ نتیجهگیری:
با استفاده از Optional، کد ما تمیزتر و ایمنتر میشود و میتوانیم جلوی بسیاری از خطاهای NullPointerException را بگیریم.
#کاربرـحرفهـای
🆔 @javapro_ir
🆔 @group_javapro
👍8🗿1
01 - مقدمه
02 - ایجاد پروژه
03 - مفهوم Bean
04 - مدل یوزر
05 - یوزر ریپو و سرویس
06 - کنترلر یوزر
07 - کنترلر یوزر بخش 2
08 - کنترلر یوزر بخش 3
09 - اسپرینگ security
10 - سرویس ثبت نام
11 - سرویس ورود
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5💯2👍1😍1
اگه تو مصاحبه ازت پرسیدن «چرا Spring؟»، فقط نگو «چون کد تکراری کمتر داره!»
حتماً این نکات رو هم بگو👇
اسپرینگ از مفاهیم وارونگی کنترل (Inversion of Control - IoC) و تزریق وابستگی (Dependency Injection - DI) استفاده میکنه.
یعنی خودت اشیاء رو نمیسازی، اسپرینگ میسازه!
اسپرینگ خیلی از موارد پایهای رو خودش هندل میکنه:
🔹 ساخت REST API
🔹 ارتباط با دیتابیس (JDBC / JPA)
🔹 مدیریت تراکنشها
🔹 امنیت و احراز هویت
اینا باعث میشن تمرکزت بره روی منطق اصلی برنامه، نه جزئیات ریز!
🧩 ۳. معماری ماژولار و منعطف
اسپرینگ یه غول سنگین نیست! هر چی رو نیاز داری انتخاب میکنی:
🔸 Spring Web → برای ساخت API
🔸 Spring Data → کار با دیتابیس
🔸 Spring Security → امنیت و دسترسی
اسپرینگ بوت میاد و دردسر رو کم میکنه:
⚙️ پیکربندی خودکار (Auto Configuration)
🛠️ تنظیمات آماده برای محیط تولید
شروع پروژهها رو سریعتر و نگهداریشون رو راحتتر میکنه.
اسپرینگ از همون اول برای محیط واقعی ساخته شده:
📋 لاگگیری داخلی
یک فریمورک جاافتاده، پایدار، و قابل اعتماد برای پروژههای بزرگ
#Java #Spring #SpringBoot #مصاحبه_برنامهنویسی #Backend #Javadev
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
بانکینو استخدام میکند | توسعهدهنده iOS (Swift) و توسعهدهنده Java (Back-End)
بانکینو در راستای توسعه و تقویت تیم فنی خود، از متخصصان حوزههای iOS و Java دعوت به همکاری مینماید.
علاقهمندان میتوانند رزومه کاری و تحصیلی خود را با درج عنوان شغلی مورد نظر در قسمت عنوان ایمیل، به آدرس زیر ارسال نمایند:
📧 Bankino@middleeastbank.ir
برای مشاهده جزئیات و شرایط احراز موقعیتهای شغلی، از طریق لینک زیر اقدام کنید:
🔗 way2pay.ir/481352
➡️ اشتراک 👍 لایک 💬 کامنت
بانکینو در راستای توسعه و تقویت تیم فنی خود، از متخصصان حوزههای iOS و Java دعوت به همکاری مینماید.
علاقهمندان میتوانند رزومه کاری و تحصیلی خود را با درج عنوان شغلی مورد نظر در قسمت عنوان ایمیل، به آدرس زیر ارسال نمایند:
برای مشاهده جزئیات و شرایط احراز موقعیتهای شغلی، از طریق لینک زیر اقدام کنید:
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😍1
در اغلب وبسایتها بخشی برای ورود و ثبتنام کاربران وجود دارد. همچنین احتمالاً مشاهده کردهاید که برخی بخشها تنها برای کاربران خاصی در دسترس هستند. در این دوره یاد میگیرید چگونه با پیادهسازی یک سرویس IAM Service و استفاده از APIهای آماده، مفاهیم مربوط به Authorization را بهصورت عملی درک کرده و پیادهسازی کنید.
01 - مقدمه
02 - ایجاد پروژه
03 - مفهوم Bean
04 - مدل یوزر
05 - یوزر ریپو و سرویس
06 - کنترلر یوزر
07 - کنترلر یوزر بخش 2
08 - کنترلر یوزر بخش 3
09 - اسپرینگ security
10 - سرویس ثبت نام
11 - سرویس ورود
⚡️ @javapro_ir✈️ @group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3
✍️ آشنایی با Functional Interfaces در جاوا
یکی از قابلیتهای قدرتمند جاوا 8، معرفی Functional Interfaces است. اینترفیسهایی که فقط یک متد انتزاعی دارند (SAM – Single Abstract Method) و میتوان از آنها به صورت مستقیم با Lambda Expressions یا Method References استفاده کرد.
سه اینترفیس بسیار پرکاربرد در جاوا عبارتند از:
* Predicate<T>:
ورودی میگیرد و یک boolean برمیگرداند.
* Function\<T, R>:
ورودی میگیرد و خروجی از نوع دیگر برمیگرداند.
* Consumer<T>:
ورودی میگیرد ولی خروجی ندارد (برای انجام عملی روی داده).
🔹 ۱. استفاده از Predicate
مثالی ساده برای بررسی شرط روی دادهها:
در اینجا با استفاده از Predicate بررسی کردیم که طول یک رشته بیشتر از ۵ هست یا خیر.
🔹 ۲. استفاده از Function
تبدیل یک ورودی به خروجی متفاوت:
اینجا رشته ورودی را گرفتیم و طول آن را به صورت عدد برگرداندیم.
🔹 ۳. استفاده از Consumer
اجرای عملی روی داده بدون بازگرداندن خروجی:
در این مثال، هر رشتهای که به Consumer بدهیم، چاپ میشود.
🔹 ۴. ترکیب آنها
گاهی لازم است چند اینترفیس را با هم ترکیب کنیم:
✅ نتیجهگیری:
استفاده از Functional Interfaces باعث میشود کدهای ما مختصرتر، قابلخواندنتر و قابلاستفاده مجدد شوند. اینترفیسهایی مثل Predicate، Function و Consumer پایه و اساس Stream API در جاوا هستند و فهم درست آنها برای برنامهنویسی مدرن در جاوا ضروری است.
یکی از قابلیتهای قدرتمند جاوا 8، معرفی Functional Interfaces است. اینترفیسهایی که فقط یک متد انتزاعی دارند (SAM – Single Abstract Method) و میتوان از آنها به صورت مستقیم با Lambda Expressions یا Method References استفاده کرد.
سه اینترفیس بسیار پرکاربرد در جاوا عبارتند از:
* Predicate<T>:
ورودی میگیرد و یک boolean برمیگرداند.
* Function\<T, R>:
ورودی میگیرد و خروجی از نوع دیگر برمیگرداند.
* Consumer<T>:
ورودی میگیرد ولی خروجی ندارد (برای انجام عملی روی داده).
🔹 ۱. استفاده از Predicate
مثالی ساده برای بررسی شرط روی دادهها:
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
Predicate<String> isLong = s -> s.length() > 5;
System.out.println(isLong.test("Hello")); // false
System.out.println(isLong.test("FunctionalInterface")); // true
}
}
در اینجا با استفاده از Predicate بررسی کردیم که طول یک رشته بیشتر از ۵ هست یا خیر.
🔹 ۲. استفاده از Function
تبدیل یک ورودی به خروجی متفاوت:
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Integer> stringLength = s -> s.length();
System.out.println(stringLength.apply("Java")); // 4
System.out.println(stringLength.apply("LambdaExpr")); // 10
}
}
اینجا رشته ورودی را گرفتیم و طول آن را به صورت عدد برگرداندیم.
🔹 ۳. استفاده از Consumer
اجرای عملی روی داده بدون بازگرداندن خروجی:
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> printer = s -> System.out.println("Hello, " + s);
printer.accept("Ali"); // Hello, Ali
printer.accept("Sara"); // Hello, Sara
}
}
در این مثال، هر رشتهای که به Consumer بدهیم، چاپ میشود.
🔹 ۴. ترکیب آنها
گاهی لازم است چند اینترفیس را با هم ترکیب کنیم:
import java.util.function.*;
public class Main {
public static void main(String[] args) {
Predicate<Integer> isEven = n -> n % 2 == 0;
Function<Integer, String> toString = n -> "عدد شما: " + n;
Consumer<String> show = s -> System.out.println(s);
int number = 8;
if (isEven.test(number)) {
String result = toString.apply(number);
show.accept(result); // خروجی: عدد شما: 8
}
}
}
✅ نتیجهگیری:
استفاده از Functional Interfaces باعث میشود کدهای ما مختصرتر، قابلخواندنتر و قابلاستفاده مجدد شوند. اینترفیسهایی مثل Predicate، Function و Consumer پایه و اساس Stream API در جاوا هستند و فهم درست آنها برای برنامهنویسی مدرن در جاوا ضروری است.
#کاربرـپیشرفته
🆔 @javapro_ir
🆔 @group_javapro
👍5❤2