برنامه نویسی جاوا | Java
5.7K subscribers
1.1K photos
158 videos
379 files
1.18K links
🎓آکـــــــــادمی جاواپـــــــــــــــرو
آموزش پیش نیازهای برنامه نویسی
آموزش مقدماتی تا پیشرفته جاوا
آموزش Spring Boot
سفارش پروژه ، دوره و تدریس خصوصی: @rzutab
مشاهده دوره ها و ثبت نام👇
wwww.academyjavapro.com
گروه جاوا : @group_javapro
Download Telegram
🔹 درک مفهوم 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
👍41
💻دوره جامع نخبگان معماری میکروسرویس ها با Java و Spring Boot بروزرسانی شد

فصل ۱۴ به دوره اضاف شد
📅تاریخ آخرین بروزرسانی:  ۱۸ اَمرداد ۱۴٠۴

🔺مشاهده
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🚀انتشار Spring Boot 4 — تحلیل کامل ۱۱ تغییر مهم!

نسخه جدید بر پایه Spring Framework 7 ساخته شده و ۱۱ تغییر بزرگ را به همراه دارد؛ از کنترل نسخه API و تزریق Bean منعطف گرفته تا Null-Safety پیشرفته و ایجاد آسان HTTP Proxy.

پشتیبانی از GraalVM Native، ارتقاء به Jackson 3.x و بهبودهای Servlet/WebSocket فقط بخشی از این تغییرات است.

در این مقاله همه جزئیات فنی و کدهای نمونه را مرور کرده‌ایم تا مسیر مهاجرت شما ساده‌تر شود.



📖 متن کامل را بخوانید و با امکانات تازه Spring Boot 4 آشنا شوید: [لینک مطالعه کامل مقاله]


➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro



#اسپرینگ_بوت4 #SpringBoot4 #برنامه_نویسی_جاوا #JavaProgramming #SpringFramework7 #راهنمای_اسپرینگ_بوت #SpringBootGuide #آموزش_اسپرینگ_بوت #SpringBootTutorial
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 استخدام برنامه‌نویس ارشد جاوا (Back-End Developer)

ما به دنبال یک توسعه‌دهنده ارشد جاوا با تجربه در سیستم‌های میکروسرویس، مسلط به 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 یا بالاتر

آمادگی برای کار در محیط‌های دورکاری و ارتباط مستقیم با مشتریان بین‌المللی


💼 مزایا:

همکاری پروژه‌ای و بلندمدت

امکان مشارکت در چند پروژه هم‌زمان

دریافت پاداش عملکرد


💬 فرآیند جذب:

مصاحبه‌ها به زبان انگلیسی انجام می‌شوند

شامل ارزیابی اولیه و مصاحبه فنی


📍 ارسال درخواست:

📄فرم ثبت‌نام را اینجا تکمیل کنید

➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
3
📱ترفندهای ChatGPT برای برنامه‌نویسان جاوا: افزایش سرعت کدنویسی و دیباگ

با استفاده از ترفندهای کاربردی ChatGPT، می‌توانید زمان کدنویسی، دیباگ و نوشتن تست‌های واحد خود را به‌طور چشمگیری کاهش دهید. برای آشنایی با این ترفندها و بهره‌برداری از آن‌ها، مقاله زیر کامل را مطالعه کنید:

🔗 https://javapro.ir/java-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 به دلیل مدیریت پیچیده‌تر حافظه.




مثال عملی
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) در جاوا

پیش از ورود به مبحث DSA، لازم است پایه‌های خود را در زبان جاوا تقویت کنید:

۱. تسلط بر مفاهیم برنامه‌نویسی شیء‌گرا شامل Abstraction، Encapsulation، Inheritance و Polymorphism

۲. آشنایی با Collections Framework شامل List، Set و Map

۳. یادگیری مدیریت استثناها (Exception Handling)

۴. تمرین کار با Java Streams و Lambda Expressions

۵. توانایی نوشتن کد تمیز، ماژولار و قابل تست

‼️ در ادامه ۴۰ سوال پرکاربرد DSA برای موفقیت در مصاحبه‌های شغلی آورده شده است:

آرایه‌ها و رشته‌ها:
۱. پیدا کردن بیشترین مجموع یک زیرآرایه
۲. یافتن تمام زیررشته‌هایی که پالیندروم هستند
۳. پیاده‌سازی مسئله «دو جمع» (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 آشنا می‌شوید.



➡️اشتراک 👍لایک 💬کامنت

⚡️ @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
📌 در جاوا 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😍32👾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
🙏3👍1
🔍 رازهای مهم جاوا برای مصاحبه‌ها

اگر سال‌ها با Java کار کرده باشید، احتمالاً فکر می‌کنید همه چیز را می‌دانید — ترفندها، نکات و حتی مشکلات پنهان. اما جاوا مثل یک همکار قدیمی است؛ درست وقتی فکر می‌کنید او را کاملاً می‌شناسید، نکته‌ای جدید رو می‌کند که نگاهتان را تغییر می‌دهد.
در اینجا چند واقعیت کمتر شناخته‌شده از جاوا را می‌بینید که حتی توسعه‌دهندگان باتجربه را هم غافلگیر می‌کند. اگر برای مصاحبه‌ی شغلی آماده می‌شوید یا می‌خواهید مهارت جاوای خود را ارتقا دهید، این لیست به شما کمک خواهد کرد.

➡️ مقدار null می‌تواند به هر نوع مرجعی Cast شود

در جاوا، شما می‌توانید 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:
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
🆕 سرفصل های دوره  Authentication & Authorization + JWT Token در Spring Boot

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 → امنیت و دسترسی

🚀 ۴. ساده‌سازی با Spring Boot
اسپرینگ بوت میاد و دردسر رو کم می‌کنه:

⚙️ پیکربندی خودکار (Auto Configuration)
🧳 سرور داخلی (مثل Tomcat)
🛠️ تنظیمات آماده برای محیط تولید

شروع پروژه‌ها رو سریع‌تر و نگهداری‌شون رو راحت‌تر می‌کنه.

🏁 ۵. آماده برای محیط Production
اسپرینگ از همون اول برای محیط واقعی ساخته شده:

📋 لاگ‌گیری داخلی
🌐 پروفایل‌های متنوع (dev، test، prod)
📊 بررسی سلامت (Health Check) و آمار (Metrics)

یک فریم‌ورک جاافتاده، پایدار، و قابل اعتماد برای پروژه‌های بزرگ 👨‍💼

📕 پس دفعه بعد که پرسیدن چرا Spring، آماده باش با یه جواب قانع‌کننده 💬😉

#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


➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😍1
🎓مینی دوره Login/Register با توکن Spring Boot

در اغلب وب‌سایت‌ها بخشی برای ورود و ثبت‌نام کاربران وجود دارد. همچنین احتمالاً مشاهده کرده‌اید که برخی بخش‌ها تنها برای کاربران خاصی در دسترس هستند. در این دوره یاد می‌گیرید چگونه با پیاده‌سازی یک سرویس IAM Service و استفاده از APIهای آماده، مفاهیم مربوط به Authorization را به‌صورت عملی درک کرده و پیاده‌سازی کنید.

📢سرفصل ها:
01 - مقدمه
02 - ایجاد پروژه
03 - مفهوم Bean
04 - مدل یوزر
05 - یوزر ریپو و سرویس
06 - کنترلر یوزر
07 - کنترلر یوزر بخش 2
08 - کنترلر یوزر بخش 3
09 - اسپرینگ security
10 - سرویس ثبت نام
11 - سرویس ورود

✔️ ثبت نام برای 100 نفر اول رایگان است

🖱جهت ثبت نام[اینجا کلیک کنید]


➡️اشتراک 👍لایک 💬کامنت

⚡️ @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
مثالی ساده برای بررسی شرط روی داده‌ها:


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
👍52