تیکه پاره های جاوا
526 subscribers
93 photos
24 videos
7 files
58 links
سلام خوش اومدید. اینجا یادداشت ها و تکه های جاوا رو کنار هم قرار میدیم :) مطالب کاملا اختصاصی و دستنویس هستند. کپی فقط با ذکر منبع و آیدی کانال❤️

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
بنظرتون خروجی کد بالا کدوم گزینه میشه؟
Anonymous Quiz
27%
ABCabc
6%
ABC
57%
abcabc
10%
abc
👏101👎1
💬 دوستان اگه در رابطه با گیت، توسعه نرم افزار و در کل در رابطه با محدودیت های اینترنت به مسئله خوردین، حتما یبار به آدرس زیر سر بزنید:

🔗 https://github.com/freedomofdevelopers/fod

☕️ @pieceJava
👏7
💠 در جاوا پارامتر ها چگونه به متد ها ارسال میشوند؟

💬 یکی از مهم ترین سوالات خیلی مهم اینه که آیا جاوا Call By Value هست یا Call By Reference ؟
خب اول باید بگم که جاوا call by value هست. اما این اصطلاحات به چه معناست؟

🔶 در جاوا Call By Value یعنی از مقادیر ورودی به متد(پارامتر های ورودی)، یک کپی گرفته میشود و تمامی اعمال بر روی کپی مقادیر ورودی انجام میشود و نه خود مقادیر ورودی. در نتیجه مقادیر ورودی دچار تغییر نمیشوند. برای مثال:
class Main {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("a = "+a + "\t b = "+b);
swap(a,b);
System.out.println("swap a and b...");
System.out.println("a = "+a + "\t b = "+b);
}
static void swap(int a,int b){
int temp = a;
a = b;
b= temp;
}
}
—————
⚙️ OUTPUT

a
= 1 b = 2
swap a and b...
a = 1 b = 2
همانطور که میبینید در اصل مقادیر هیچ تغییری ایجاد نشده است.

🔶 در مقابل Call By Reference هم مقادیر ورودی و هم کپی ایجاد شده به یک خانه از حافظه اشاره میکنند. در نتیجه تغییری درون متد اعمال شود، این تغییرات بر روی ورودی تاثیر مستقیم خواهد داشت.( یعنی اگه جاوا call By Reference بود پس متد swap باید برای a و b عمل میکرد )

اما یک ابهام وجود دارد. اینکه چرا در برنامه زیر، مقدار x در آبجکت ذخیره شده به عدد 475 تغییر پیدا میکند؟

class Main {
public static void main(String[] args) {
Test t = new Test(1);
System.out.println("t.x = "+t.x);
changeX(t);
System.out.println("Change X Value...");
System.out.println("t.x = "+t.x);
}
static void changeX(Test t) {t.x = 475;}

}
class Test{
int x;
public Test(int x) {
this.x = x;
}
}
—————
⚙️ OUTPUT

t.x = 1
Change X Value...
t.x = 475


در این حالت هم وقتی یک متغیر از نوع مرجع بعنوان ورودی ارسال میشود، در واقع فقط آدرس آبجکت در حافظه بعنوان کپی فرستاده میشود. در نتیجه از آنجا که هم ورودی و هم کپی ایجاد شده به یک خانه از حافظه اشاره میکنند، تغییر اعمال شده مستقیما بر روی داده های خانه مورد نظر در حافظه اثر میگذارند.


💬 پس اگه ورودی و کپی ایجاد شده هر دو آدرسشون به یه خونه اشاره کنن، این تغییر صورت میگیره اما اگر سعی کنیم آدرس یه آبجکت دیگه رو به متغیر پاس بدیم، روی ورودی اصلی هیچ تغییری اعمال نمیشه. مثلا:
class Main {
public static void main(String[] args) {
Test t = new Test(1);
System.out.println("t.x = "+t.x);
changeObject(t);
System.out.println("Change Object...");
System.out.println("t.x = "+t.x);
}
static void changeObject(Test t) {
t = new Test(10);
}
}
class Test{
int x;
public Test(int x) {
this.x = x;
}
}
—————
⚙️ OUTPUT

t.x = 1
Change Object...
t.x = 1
———
#pass_by_reference #pass_by_value
#call_by_value #call_by_reference
☕️ @PIECEJAVA
👍7
مثال های استفاده شده
Call By Value / Call By Reference
☕️ @PIECEJAVA
7
This media is not supported in your browser
VIEW IN TELEGRAM
یه مثال خیلی باحال از call by value و call by reference😄

☕️ @PIECEJAVA
👍121
تیکه پاره های جاوا
مطالب کانال تا چه حد براتون واضح و مفهومه؟
راستی تا یادم نرفته اگه نظر / انتقاد یا پیشنهادی هم دارین خوشحال میشم باهام در میون بزارید❤️ ^ ^
~ @MRVJ475
9
This media is not supported in your browser
VIEW IN TELEGRAM
#یکبار_برای_همیشه
چرا cmd کمپایلر جاوا (javac) یا java -version رو شناسایی نمیکنه؟

❗️بررسی خطای
'****' is not recognized as an internal or external command,
operable program or batch file.
———
☕️@pieceJava
👏81
#پیشنهاد
💠 معرفی دوره جاوا

یکی از بهترین دوره های جاوا (متدلوژی برنامه نویسی) که دیدم :)
دوره از پروفسور مهران سهامی هستش از دانشگاه استنفورد و البته به زبان انگلیسیه.

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

× قبل از شروع دوره حتما Course Description رو بخونید...

🔸 آدرس دوره:
| آدرس سایت دوره |

🔻 مشاهده فیلم ها از طریق یوتیوب (همراه با زیرنویس زبان اصلی):
| آدرس پلی لیست یوتیوب دوره |
8
💠 تفاوت runtime error و compile time error و logical error
5
تیکه پاره های جاوا
💠 تفاوت runtime error و compile time error و logical error
⚠️ خطای رانتایم
خطای رانتایم در زمان اجرا رویت میشود. برای مثال:
- زمانی که کاربر از طریق اسکنر یک داده نامعتبر را وارد کند (فرضا بجای عدد رشته رو وارد کنه).
- تبدیل رشته حاوی کاراکتر به عدد: Integer.parsInt("a1")
- زمانی که حافظه استک سر ریز شود
- تقسیم 1 بر 0

💡این نوع خطا اکثر اوقات بر اساس ورودی های نامعتبر رخ میدهد.

⚠️ خطای کمپایل
خطای کمپایل مربوط به خطا هاییست که پیش از اجرا شدن برنامه رخ میدهد و معمولا خود IDE قبل از اجرای برنامه به شما اخطار میدهد. برای مثال:
- ذخیره یک داده اشتباه در مکان اشتباه:
int name = "Mohammad Reza";

- جا انداختن سمیکالن ;
- جا انداختن آکولاد باز یا بسته یا هر دو {}
- استفاده از کلاسی که هنوز تعریف نشده است
- استفاده از متغیری که هنوز ایجاد نشده است.
- استفاده از متغیری که هنوز مقدار دهی نشده است:
int sum;
System.out.println(sum);
رفع این خطاها عموما بدون هیچ پیچیدگیست. زیرا به کمک کمپایلر جای خطا به شما نشان داده میشود.

⚠️خطای منطقی
یکی از سخت ترین نوع خطا ها خطای منطقیست. در واقع برنامه بدون هیچ مشکلی اجرا و کار میکند اما نتیجه اشتباه را برمیگرداند. در این حالت میگوییم خطای منطقی رخ داده است. برای مثال:

برنامه ای بنویسید که دو عدد 2 و 5 را با هم جمع کند و نمایش دهد:
حالا اگر بین 2 و 5 بجای + از هر عملگر دیگری استفاده کنید، از آنجا که نتیجه اشتباه خواهد بود میگوییم خطای منطقی رخ داده است.

#runtime_error #compile_error
#errors #error #runtime #compile
#logical_error
—————
تیکه پاره های جاوا
@PieceJava
6
#پیشنهاد
💠 پروژه چی بنویسم؟

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

ضمنا ناگفته نمونه که سورس پروژه ها از طریق آدرس زیر قابل دسترسیه. تقریبا به اکثر زبان ها موجود هستن:
🔗 پروژه ها
🔗 سورس پروژه ها
@PieceJava
👍64😁1
💠 کلیدواژه var در جاوا

🔆 از بعد جاوای 10 میتوان بجای نوشتن مستقیم نوع داده ها، از کلیدواژه var استفاده کرد.
در نتیجه در خط کد زیر، میتوانید نوع داده یعنی String را
String name = "Mohammad Reza";
با کلید واژه var جایگزین کنید:
var name = "Mohammad Reza";

در این حالت خود کمپایلر نوع داده را تشخیص میدهد.

⁉️ آیا var در جاوا مشابه var در جاوا اسکریپت است؟
جاوا یک زبان statically typed است. یعنی نوع داده ها از همان ابتدا که مشخص میشود، تا آخر برنامه ثابت میماند. در نتیجه var در جاوا کاملا متفاوت از var در جاوا اسکریپت میباشد. در جاوا اسکریپت هر زمان که بخواهید میتوانید نوع داده را تغییر دهید. اما همینکار در جاوا خطای کمپایل خواهد داشت:
var text = "Hello World";
text = 23; // Incompatible types

چند مثال استفاده از var:
1️⃣
Person person = new Person();
var person = new Person();

2️⃣
ArrayList<Integer> numbers = new ArrayList<>();
var numbers = new ArrayList<Integer>();

3️⃣
int[] x = {1,2,3,4,5};
int[] y = new int[10];

var x = new int[]{1,2,3,4,5};
var y = new int[10];


🟡 متغیر از نوع var میتواند فاینال تعریف شود تا از مقداردهی دوباره آن جلوگیری شود:
final var text = "Hello World"
(بر خلاف کاتلین که val برای مقادیر ثابت بود، اینجا چیزی به نام val نداریم و باید از فاینال استفاده کنیم)

⚠️ در حالت های زیر نمیتوانید از var استفاده کنید. در صورت استفاده خطای کمپایل خواهید داشت:
هر کجا که نوع داده برای کمپایلر مبهم باشد:
var a;
var nothing = null;
var lambda = () -> System.out.println("Pity!");
var method = this::someMethod;

متغیر از نوع var بعنوان یک متغیر گلوبال به کار برود.
class Person{
var name;
var adress;
var age;
}

کلیدواژه var تعیین کننده خروجی متد یا نوع ورودی متد باشد.
var myMethod(){

}

void myMethod(var x){

}

#var #keywords
——————-
تیکه پاره های جاوا
@PieceJava
👍122
💠 الگوی طراحی سینگلتون
#الگوی_طراحی
🧩 دیزاین پترن ها یا الگو های طراحی یکسری روش ها و تکنیک ها برای حل یک مسئله خاص هستند. در این قسمت میخواهیم با الگوی سینگلتون برای طراحی کلاس سینگلتون آشنا بشیم

🔆 کلاس سینگلتون به کلاسی گفته میشود که از آن فقط یک نمونه میتوان ایجاد کرد. یعنی هر نمونه ای که از این کلاس تولید کنید، همگی به یک خانه از حافظه اشاره میکنند.

☕️ @PieceJava
👍10
▫️ دو نکته کلیدی در هنگام ساخت کلاس سینگلتون باید رعایت شود:
- سطح دسترسی تمامی کنستراکتور های کلاستان را باید پرایوت تعریف کنید تا از این کلاس هیچ نمونه ای قابل ایجاد شدن نباشد.
- در کلاستان یک نمونه استاتیک از همین کلاس تعریف کنید. به گونه ای که دسترسی به این نمونه از طریق یک متد استاتیک صورت گیرد.
برای مثال:

class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}

public static Singleton getInstance() {
return instance;
}
}

حالا یک کلاس سینگلتون ساده ایجاد کرده ایم. پس اگر ما از الگوی سینگلتون در کلاس خود استفاده کرده باشیم کد زیر باید خروجی معادل true داشته باشد: (ترو به معنای برابر بودن هر دو نمونه ایجاد شده یا اشاره هر دو نمونه به یک خانه از حافظه دارد)

public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); //prints true
}
}

کاربرد کلاس سینگلتون
در حالت کلی اگر بخواهید از کلاستان فقط یک نمونه در کل برنامه وجود داشته باشد میتوانید از این الگو استفاده کنید. برای مثال برای جابجایی داده ها در میان کلاس ها و یا برای اتصال برنامه به دیتابیس میتوانیم از این الگو استفاده کنیم. برای مثال:
import java.util.NoSuchElementException;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Database db1;
// refers to the only object of Database
db1= Database.getInstance();
db1.getConnection();
}
}
class Database {
private static Database dbObject;
private Database() {
}
public static Database getInstance() {

// create object if it's not already created
if(dbObject == null) {
dbObject = new Database();
}

// returns the singleton object
return dbObject;
}
public void getConnection() {
System.out.println("You are now connected to the database.");
}
}

پس با توجه به الگوی سینگلتون، در برنامه بالا کافیست فقط یکبار متد getInstance صدا زده شود تا برنامه به دیتابیس متصل شود.

💬 مثال اول اگه دقت کرده باشید، instance رو بیرون از متد getInstance مقدار دهی کردیم درصورتی که تو مثال بعدی، اینکار رو درصورت نال بودن dbObject در متد getInstance انجام دادیم. به اینکار Lazy Loading گفته میشه. یعنی نمونه تنها در زمانی ساخته میشه که لازم باشه که همین میتونه باعث صرفه جویی در مصرف منابع بشه.

#design_patterns #singleton #gof
————
☕️ @PIECEJAVA
👍10
💎 یک متد با چند خروجی همزمان در جاوا

🔴 سوال: آیا متد میتونه همزمان چند مقدار رو ریترن کنه؟
🟢 جواب: هم آره و هم نه!

🔆 در واقع بصورت عادی یک متد فقط میتونه یک چیز رو ریترن کنه. پس نمیشه انتظار چند خروجی همزمان رو داشت
اما میشه داده رو یجورایی در قالب یه بسته خروجی داد که البته در زیر انواع روش ها رو برای این کار توضیح میدم:

🔅 استفاده از آرایه:
متدتون میتونه خروجی با استفاده از آرایه داشته باشه. مثلا فرض کنید یه متد دارین که مختصات پیش فرض رو برمیگردونه:
double[] defaultCoordinate(){
double[] co = new double[2];
co[0] = 2.0;
co[1] = 4.6;
return co;
}
🔅 استفاده از کلاس Pair:
کلاس Pair کلاسیه که فقط دو مقدار میتونه نگهداری کنه و ضمنا مقادیری که درش ذخیره میشه دیگه قابل تغییر نیست و فقط قابل دسترسیه. یعنی نمونه های این کلاس Immutable 🔗 هستن:
Pair<String,Double> studentInfo = new Pair<>("MohammadReza",14.5);
در نتیجه میشه خروجی یک متد رو یک نمونه از کلاس Pair گذاشت:
Pair stInfo(String name,double grade){
Pair<String,Double> studentInfo = new Pair<>(name,grade);
return studentInfo;
}

🔅 استفاده از کلاس های کتابخانه Tuple:
اگه بیشتر از 2 داده برای خروجی داشته باشید، میتونید از کلاس های کتابخونه Tuple استفاده کنید(کارکردشون دقیقا مشابه کلاس Pair اما برای ذخیره بیشتر از 2 داده):
For 1 element - Unit<A>
For 2 elements - Pair<A, B>
For 3 elements - Triplet<A, B, C>
For 4 elements - Quartet<A, B, C, D>
For 5 elements - Quintet<A, B, C, D, E>
For 6 elements - Sextet<A, B, C, D, E, F>
For 7 elements - Septet<A, B, C, D, E, F, G>
For 8 elements - Octet<A, B, C, D, E, F, G, H>
For 9 elements - Ennead<A, B, C, D, E, F, G, H, I>
For 10 elements - Decade<A, B, C, D, E, F, G, H, I, J>


🔅 کلاس خودتون رو تعریف کنید:
میتونید کلاس خودتون رو تعریف کنید و به تعدادی که میخواید براش فیلد تعریف کنید. در نهایت وقتی میخواید متدتون خروجی داشته باشه، نوع خروجی متدتون رو نمونه ای از کلاس تعریف شده قرار میدین. مثلا:
class Coordinate{
int x,y,z;
coordinate(int x,int y, int z){
this.x = x;
this.y = y;
this.z = z;
}
}
و حالا متدی که تعریف میکنیم:
Coordinate position(int x,int y, int z){
return new Coordinate(x,y,z);
}
که در واقع سه داده ورودی رو در قالب یک داده (از کلاس Coordinate) خروجی میده.

حرف آخر اینکه علاوه بر روش هایی که بالا تعریف کردیم، بازم میشه جور دیگه خروجی رو داد. مثلا میتونید از List یا Map هم استفاده کنید :)
———
#methods #return #tuple #pair
تیکه پاره های جاوا
@PieceJava
👍10
💎 معرفی وبسایت پرکاربرد openbase

وبسایت openbase.com یکی از پرکاربرد ترین مراجع آنلاین تو انتخاب پکیج مناسب برای انجام فعالیتی خاص محسوب میشه.
⁉️ فرض کنید قصد دارید یک پکیج برای راه اندازی Date Picker نصب کنید و از طرفی، میخواید بدونید که محبوب ترین پکیج برای این کار چیه؟!

🔆 برای همین وارد این وبسایت میشید، از قسمت سرچ اسم Date Picker رو مینویسید، سمت راست فیلد سرچ، زبان مورد نظرتون رو انتخاب و سرچ رو انجام میدید. این وبسایت 10 تا از محبوب ترین پکیج ها رو از نظر تعداد نصب و بازخورد کاربران رو براتون نمایش میده و به سادگی میتونید بهترین پکیج رو برای هر کاری پیدا کنید.

💬 زبان های پشتیبانی شده : Javascript, Swift, Python, Java, Go, Rust
#مثبت_برنامه_نویس #معرفی_وبسایت

🌐 @pieceJS
10👍2