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

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
💎 ساختار Try With Resources

🔅 یه حالت دیگه از ترای کچ داریم به نام Try With Resources که از نسخه 7 جاوا اضافه شده.
بیشترین استفاده رو با ریسورس ها داره. ریسورس اصطلاحا به ابجکتی گفته میشه که بعد از اتمام کار لازمه که کلوز بشه. مثل فایل ها، سوکت ها و... پیش از این بستن ابجکت لازم به تعریف بخش فاینلی داشت. مثلا:
FileWriter fw = null;
try{
fw = new FileWriter("....txt");
...
}catch(IOException e){
...
}finally{
fw.close();
}
بخش فاینلی چه درصورتی که برنامه دارای خطا یا چه بدون خطا بود در هر صورت اجرا میشه.
اما با Try With Resources احتیاجی به بخش فاینلی نیست و خود استیتمنت بصورت خودکار فایل رو کلوز میکنه. کلوز کردن فایل میتونه جلوی خیلی از مشکلات از جمله خراب شدن فایل و ... رو بگیره.
🔅 باز نویسی کد بالا با ساختار ترای ویز ریسورسز:
try(FileWriter fw = new FileWriter("...txt")){
...
}catch(IOException e){
...
}

#Try_Catch #Try_With_resources #File #IO #FileWriter #close #Exception

@pieceJava
💎 اضافه کردن به فایل بدون حذف شدن اطلاعات قبلی

یک راه برای نوشتن داخل فایل، استفاده از FileWriter هست.
FileWriter fw = new FileWriter("myText.txt");

اما با هر بار باز کردن و نوشتن داخل فایل ، اطلاعات قبلی پاک میشه و باید دوباره نوشته بشه.

👈 برای اینکه اطلاعات جدید به اطلاعات قبلی append بشه (به خطوط بعدی اضافه بشه) کنار ادرس فایل ، true رو قرار میدیم:
FileWriter fw = new FileWriter("myText.txt",true);

ترو به معنای فعال سازی قابلیت append هست.

#IO #FileWriter

@pieceJava
💎 تفاوت Constructor و Static Factory Method

🔆 سازنده یا Constructor:
زمانی که یک شی (نمونه / آبجکت) از یک کلاس ایجاد میکنیم، برای مقدار دهی اولیه و استفاده از مشخصات شی، یک کنستراکتور هم ایجاد میکنیم. در این حالت میتوان یکسری مقدار دهی اولیه برای شی قرار داد:
 MyClass class = new Class();

🔆 مشخصات و ویژگی های سازنده:
- اسم سازنده باید هم نام با اسم کلاس باشد
- نوع بازگشتی نداشته باشد
- اگر برای کلاس سازنده ای تعریف نشده باشد، کمپایلر بصورت خودکار یک default constructor برای کلاس قرار خواهد داد.
- سازنده میتواند دارای سطوح دسترسی public, private, protected, default باشد. (اگر سازنده ای پرایوت تعریف شده باشد، خارج از خود کلاس قابل استفاده نخواهد بود.)
- سازنده میتواند بدون ورودی باشد. (default constructor)
- یک کلاس میتواند شامل چند سازنده با ورودی های مختلف باشد.

💡 در مقابل میتوانیم از Static Factory Method ها هم استفاده کنیم. اگر داخل کلاس متدی ایجاد کنیم که نوع بازگشتی یک شی از همین کلاس باشه، به این متد Static Factory Method گفته میشه.

🔆 در اینجا میتونید مزایای استفاده از Static Factory Methods رو مشاهده کنید:
دارای اسم با معنی
نوع بازگشتی دارند
میتوان یک شی ( نمونه / ابجکت) بصورت کنترل شده از یک کلاس بوسیله این متد ها ایجاد کرد (برای مثال الگوی سینگلتون که در آینده با هم بررسی خواهیم کرد)
از آنجا که Static Factory Methods دارای اسم با معنی میباشد، به خوانایی کد کمک میکند

🔰مثال:

LocalDateTime now = LocalDateTime.now();
ایجاد یک نمونه از کلاس LocalDateTime بدون استفاده از کنستراکتور و بوسیله متد استاتیک now
String str = String.valueOf(4);
ایجاد یک نمونه از کلاس String و استفاده از متد استاتیک valueOf برای تبدیل عدد به رشته

#constructor #static #static_factory_method #static_method

@pieceJava
👍4
💎 اورراید در جاوا (Override🌀)

🌀اورراید زمانی اتفاق می افتد که کلاس فرزند (زیر کلاس، subclass)، متدی دقیقا مشابه یکی از متد های کلاس پدر (والد / superclass / parent) داشته باشد.

🔰 مثال:
class Parent{
public void job()
{
System.out.println("Programmer");
}
}

class child extends Parent{
@Override
public void job()
{
System.out.println("Programmer too :)");
}
}

🔆 قوانین اورراید کردن یک متد:
1. متد باید همنام متد کلاس والد باشد
2. پارامتر ها و نوع بازگشتی متد نیز باید مشابه متد کلاس والد باشد
3. باید رابطه ارث بری میان کلاس ها برقرار باشد
4. در صورتی که کلاس والد بصورت انتزاعی (abstract) باشد، باید تمامی متد های آن در کلاس فرزند اورراید شود.

چه متد هایی قابل اورراید کردن نیست؟
متد های فاینال (Final methods):
متد های فاینل قابل اورراید کردن نیستند.

سازنده (Constructor methods):
از انجا که سازنده ها باید هم نام کلاس باشند، قابل اورراید کردن نیستند.

متد های ایستا (Static methods):
مانند متد های فاینال، متد های ایستا قابل اورراید کردن نیستند. متد های ایستا معمولا نسبت به کلاس فرزند، مخفی میمانند.
#Override #inheritence

@pieceJava
👍3
💎 اورلود در جاوا (Overload🌀)

🔆 توی جاوا اگر دو یا چند متد وجود داشته باشند، بطوریکه همنام ولی دارای پارامتر های متفاوت (تفاوت در تعداد پارامتر ها، نوع پارامتر ها) باشند، به این متد ها متد های اورلود شده گفته میشود و به این ویژگی اورلودینگ گفته میشود.

🔰مثال ( 1 ):
void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }
برای مثال توی این مورد متد func() اورلود شده است. همانطور که پیش تر اشاره شد، این متد ها همنام ولی در تعداد و نوع پارامتر های ورودی متفاوتند.

🔰مثال ( 2 ):
با توجه به تصویر، متد اول دو پارامتر ورودی از نوع int دریافت میکند در حالی که متد دوم دو پارامتر ورودی از نوع دابل دریافت میکند.

⭕️ قوانین اورلود کردن متد:
متد ها باید همنام ولی در تعداد، نوع پارامتر ها تفاوت داشته باشند.
نوع بازگشتی تعیین کننده اورلودینگ نیست (void, int ,....)



@pieceJava
👍3
💎 مقایسه اشیا (ابجکت ها) در جاوا

🔆 توی جاوا هر کلاس بصورت پیشفرض از کلاس Object ارث بری میکند. کلاس Object شامل متد هایی مثل hashCode, equals, toString و... میشود که کاربرد گسترده ای در رابطه با کار با ابجکت ها دارند. به همین منظور برای مقایسه ابجکت ها از متد equals و hashCode از کلاس Object استفاده میشود.

🔗در مورد کلاس آبجکت از اینجا بخوانید

🔅هش کد در جاوا یک عدد صحیح 32 بیتی میباشد. هش کد یک مقدار منحصر بفرده که بصورت پیشفرض توسط JVM برای هر نمونه (شی / ابجکت) تعریف میشود.

👈 طبق این تعریف اگر دو ابجکت دارای هش کد برابر باشند، یعنی با هم برابرند با توجه به متد equals ولی لزوما دو ابجکت با هش کد برابر، با هم برابر نیستند. یعنی این شرط لازم و کافی نیست.

برای بررسی برابر بودن ابجکت ها، لازم است متد equals پیاده سازی شود.
🔰 مثال:
💠 کلاس Employee

داخل کلاس متد equals را اورراید میکنیم و فیلد هارا با هم مقایسه میکنیم (البته بستگی به این داره که برابری از نظر شما چه شرایطی داشته باشد. توی این مثال من شرط برابری را برابر بودن فیلد ها قرار دادم).
(برای بهتر دیده شدن کد ها، گوشی را در حالت افقی نگه دارید)

public class Employee {
private String firstName;
private String lastName;

public Employee(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee a = (Employee) o;
return firstName.equals(a.firstName) && lastName.equals(a.lastName);
}
}

بعد از اورراید کردن متد، شرایط زیر را بررسی میکنیم:
() شرط اول: this == o به این معناست که اگر هر دو ابجکت به یک ادرس از حافظه اشاره کنند، یعنی با هم برابرند و مقدار ترو را برگرداند.

() شرط دوم: اگر ابجکت o از یک کلاس نباشد و یا مقدار null را داشته باشد، یعنی با هم برابر نیستند و مقدار فالس را برگرداند.

اگر شرط یک و دو با موفقیت پشت سر گذاشته شود، نوع o را که از نوع Object میباشد، به نوع Employee تغییر میدهیم (type casting) و سپس سراغ شرط آخر میرویم.

() شرط آخر: با توجه به برابر بودن یا نبودن فیلد های کلاس، مقدار ترو یا فالس را برمیگرداند.

🔰 بعنوان مثال با توجه به متد equals باید این دو ابجکت شرط برابری را داشته باشند:

Employee e1 = new Employee("A","B");
Employee e2 = new Employee("A","B");
System.out.println(e1.equals(e2));//returns true


#equals #object #hashCode #hash #inheritence

@pieceJava
👍5
تیکه پاره های جاوا pinned «💎 تفاوت Constructor و Static Factory Method 🔆 سازنده یا Constructor: زمانی که یک شی (نمونه / آبجکت) از یک کلاس ایجاد میکنیم، برای مقدار دهی اولیه و استفاده از مشخصات شی، یک کنستراکتور هم ایجاد میکنیم. در این حالت میتوان یکسری مقدار دهی اولیه برای شی قرار…»
💎 تفاوت equals و compareTo برای مقایسه رشته ها

🔆 هر دو متد برای مقایسه رشته کاربرد دارند ولی این بین تفاوت هایی وجود دارد. شاید بزرگترین تفاوت این باشد که equals ابجکت ها و comareTo حروف را با هم مقایسه میکند. طبق این قضیه میتوان نتیجه گرفت که در مقایسه ی null :

"foo".equals((String) null)
مقدار فالس را بازگشت میدهد. این در صورتی است که

"foo".compareTo( (String) null)
استثنای NullPointerException را به همراه خواهد داشت.

🔆 متد equals فقط دو مقدار false و true را بازگشت میدهد و آنهم زمانیست که مقدار دو رشته برابر یا نابرابر باشد. ضمنا همانطور که اشاره کردیم متد equals در هنگام مقایسه، از رخ دادن خطای NullPointerException جلو گیری میکند.

🔆 متد compareTo با توجه به اسناد جاوا، رشته ها را بصورت حرف به حرف (لغوی / lexographically) و همینطور از نظر طول رشته مقایسه میکند. طبق این مقایسه، این متد سه مقدار صفر، مثبت و منفی را بازگشت میدهد.

🔅مقدار صفر مختص زمانیست که رشته ها هم از لحاظ لغت و هم طول مقدار برابر داشته باشند.
🔅 مقدار منفی مختص زمانیست که رشته اول نسبت به رشته دوم طول کمتری داشته باشد.
🔅مقدار مثبت نیز مختص زمانیست که رشته اول نسبت به رشته دوم طول بیشتری داشته باشد

🔰 مثال:
⭕️ System.out.println("Aaaa".compareTo("Aa"));
یک مقدار مثبت را بازگشت میدهد. زیرا رشته اول نسبت به رشته دوم طول بیشتری دارد.

⭕️ System.out.println("Aa".compareTo("Aaaaa"));
یک مقدار منفی را برمیگرداند. زیرا رشته دوم نسبت به رشته اول طول بیشتری دارد.

⭕️ System.out.println("Aa".compareTo("Aa"));
مقدار صفر را دارد زیرا در این مقایسه رشته ها مقدار برابر را دارند.

⭕️ System.out.println("A".compareTo("B"));
در این مثال از آنجا که از نظر لغوی (lexographically) حرف "B" نسبت به حرف "A" در ترتیب الفبا جلوتر قرار گرفته است، خروجی مقدار منفی خواهد بود.
#equals #string #compareto #lexographically


@pieceJava
👍4
💎معنی Mutable و Immutable بودن کلاس ها (قابل تغییر و غیر قابل تغییر بودن)

🔅به آبجکت هایی که بعد از ایجاد شدن قابل تغییر هستند، Mutable گفته میشود. برای مثال کلاس Date یا StringBuilder
🔅در مقابل به ابجکت هایی که پس از ایجاد شدن قابل تغییر نیستند، Immutable گفته میشود. برای مثال کلاس String, Integer, Long,...

🔰 نمونه کلاس String:

String str = "Test";
str.replaceAll("T","s);
System.out.println(str)
;//prints Test

در قطعه کد بالا پس از خروجی گرفتن رشته str خواهید دید که رشته بدون هیچ تغییر خاصی نمایش داده خواهد شد.
(در اینباره بیشتر بخوانید)

🔆تفاوت های کلاس های Mutable و Immutable
⭕️در کلاس های Mutable فیلد ها بعد از ایجاد ابجکت قابل تغییر هستند در صورتی که در کلاس های Immutable چنین چیزی ممکن نیست.

⭕️کلاس های Mutable دارای متد هایی برای تغییر مقادیر فیلد ها مانند setter & getter هستند. در صورتی که کلاس های Immutable فقط دارای متد های getter میباشند.

⁉️چرا بعضی از کلاس ها Immutable هستند و یا چرا باید باشند؟
- همانطور که گفتیم مقادیر این کلاس ها غیر قابل تغییر است و از لحاظ مدیریت حافظه بصرفه است.
- کلاس های Immutable اصطلاحا Thread Safe هستند (در محیط های چند نخی (multithreading)) در واقع Thread safety به فرایند امن سازی برنامه در محیط های چند نخی گفته میشود.
🔗 نحوه ایجاد کلاس Immutable

#immutable #mutable #threadsafe #thread_safe #StringBuilder #Date #String

@pieceJava
👍3
💎 کلیدواژه final

🔆کلیدواژه فاینال برای محدود کردن کاربرد یک متغیر، متود یا یک کلاس به کار میرود که البته در هر کدام از این موارد، کاربرد متفاوت است.

⭕️ اگر یک متغیر را فاینال تعریف کنیم، به این معناست که پس از مقدار دهی اولیه، مقدار متغیر دچار تغییرات نخواهد شد و مقدار دهی دوباره آن، خطای کمپایلر را به همراه خواهد داشت:
final int length = 5;


⭕️ اگر یک کلاس را فاینال تعریف کنیم، توسط هیچ کلاسی قابل ارث بری نخواهد بود (فاینال تعریف کردن یک کلاس به معنی Immutable کردن این کلاس نیست. زیرا فقط از ارث بری شدن جلوگیری میکند.)
final class Test{ }


⭕️ اگر یک متد را فاینال تعریف کنیم، توسط هیچ زیرکلاسی قابل اورراید کردن نخواهد بود. یا به عبارتی بدنه متد تحت هیچ شرایطی در زیرکلاس ها تغییر نخواهد کرد.
final void method(){ }

⭕️ اگر یک آرگومان را فاینال تعریف کنیم، این به این معناست که مقدار آن در بدنه متد قابل تغییر نمیباشد.
public void methodWithFinalArguments(final int x) {
x=1;
}
برای مثال، تکه کد بالا خطای کمپایلر را خواهد داشت.

#final #keywords

@pieceJava
👍3
💎نحوه ایجاد کلاس Immutable

🔗(در مورد ویژگی کلاس های Immutable از اینجا بخوانید )
🔅برای ایجاد کلاس های Immutable باید یک سری شرایط برقرار باشد:
⭕️کلاس نباید قابل ارث بری باشد. به همین منظور کلاس را فاینال تعریف میکنیم.
⭕️فیلد ها و داده های کلاس باید پرایوت باشند. در این صورت دسترسی فقط از طریق متد ها امکان پذیر خواهد بود.
⭕️فیلد ها و داده های کلاس باید فاینال باشند. در اینصورت فقط یکبار قابل مقدار دهی خواهند بود.
⭕️مقدار دهی فیلد ها فقط از طریق سازنده (constructor) باید صورت گیرد.
⭕️کلاس باید فقط دارای متد گتر باشد. برای بازگرداندن مقدار ترجیحا یک مقدار کپی از فیلد برگردانده شود.

🔰مثال:
final class Immutable{
private final int instanceNumber;
public Immutable(int instanceNumber) {
this.instanceNumber = instanceNumber;
}
public int getInstanceNumber() {
return instanceNumber;
}
}

@pieceJava
👍3
💎ساختار for-each در جاوا

🔆 در جاوا ساختار کلاسیک حلقه فور از سه بخش تشکیل شده است. بخش مقدار دهی شمارنده، شرط حلقه و تعداد گام های شمارنده برای رسیدن به پایان حلقه:
for (initialization; boolean-condition; step) {
statement;
}

🔅 یک حالت دیگه از فور وجود دارد که اصطلاحا به آن for each (Enhanced for / فور بهبود یافته) گفته میشود که البته برای پیمایش آرایه یا کالکشن ها مانند آری لیست، لینک لیست و ... کاربرد دارد. ضمنا برای مقدار دهی آرایه یا کالکشن ها ، این ساختار مناسب نمیباشد زیرا به ایندکس دسترسی نداریم.

ساختار for each:
for (data_type var_name : array | collection) {
// code
}

در این نوع ساختار از حلقه فور، در هر بار پیمایش بترتیب ابجکت هارا در یک خانه از حافظه (توی مثال بالا یعنی بجای data_type ) ذخیره و در ساختار استفاده میشود:
public class pieceJava {
public static void main(String[] args)
{
int[] array = {1,2,5,4,7,5};
for(int i: array)
{
System.out.print(i+"\t");
}
}
}
/////Output: 1 2 5 4 7 5

در رابطه با کالکشن ها نیز به همین صورت میتوان پیمایش را انجام داد:
import java.util.ArrayList;

public class pieceJava {
//Telegram: @pieceJava
public static void main(String[] args)
{
ArrayList<Data> datas = new ArrayList<>();
datas.add(new Data(5));
datas.add(new Data(6));
datas.add(new Data(7));
datas.add(new Data(8));
datas.add(new Data(9));

for(Data data: datas)
{
System.out.print(data.getData()+"\t");
}

}
}
class Data{
private int data;
public Data(int data)
{
this.data = data;
}
public int getData() {
return data;
}
}
//output: 5 6 7 8 9
————
#for #for_each #enhanced #enhanced_for

@pieceJava
👍2
تیکه پاره های جاوا pinned «💎 مقایسه اشیا (ابجکت ها) در جاوا 🔆 توی جاوا هر کلاس بصورت پیشفرض از کلاس Object ارث بری میکند. کلاس Object شامل متد هایی مثل hashCode, equals, toString و... میشود که کاربرد گسترده ای در رابطه با کار با ابجکت ها دارند. به همین منظور برای مقایسه ابجکت ها از…»
💎چطور سازنده ها را بهم متصل کنیم؟ (Chaining Constructors)

⚙️ برای ایجاد ارتباط میان سازنده ها (کنستراکتور) دو حالت وجود دارد:
👈 اتصال سازنده ها در یک کلاس
👈 اتصال سازنده های سوپر کلاس در زیر کلاس


🔅 اتصال سازنده ها در یک کلاس
در این حالت از کلیدواژه this() استفاده میکنیم. در واقع this در این مورد اشاره به سازنده های کلاس دارد.(برای خوانایی بهتر کد صفحه را در حالت افقی نگه دارید):

class Chaining{
private String firstname;
private int age;
private String lastname;
//first constructor
public Chaining(String firstname,String lastname)
{
this.firstname = firstname;
this.lastname = lastname;
}
//chaining constructors
public Chaining(int age,String firstname,String lastname){
this(firstname,lastname);
this.age = age;
}
}
در این مثال در بدنه سازنده دوم بوسیله کلیدواژه this به سازنده اول اشاره کرده ایم و مقادیر ورودی را به سازنده اول بوسیله کلیدواژه this نسبت داده ایم.

💡ضمنا با توجه به ورودی هر سازنده، میتوان مشخص کرد که this دقیقا به کدام سازنده اشاره دارد
🔰برای مثال:
class Temp {
public Temp() {
// calls constructor 2
this(5);
System.out.println("The Default constructor");
}

// parameterized constructor 2
public Temp(int x) {
// calls constructor 3
this(5, 15);
System.out.println(x);
}

// parameterized constructor 3
public Temp(int x, int y) {
System.out.println(x * y);
}
}

حتما به خاطر داشته باشید که برای اشاره (this) به سازنده های پیشین حتما باید اینکار در خط اول بعد از ایجاد سازنده جدید صورت گیرد زیرا در غیر این صورت خطای کمپایلر را بدنبال خواهد داشت.


🔅 اتصال سازنده های سوپر کلاس در زیر کلاس
برای اینکار از کلیدواژه super استفاده میشود. ضمنا تمامی قوانین در رابطه با this ، برای super نیز برقرار است:
class SuperClass{
private String firstName;
private String lastName;
public SuperClass(String firstName,String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
}

class Chaining extends SuperClass{
private int age;
public Chaining(String firstName, String lastName,int age) {
super(firstName, lastName);
this.age = age;
}
}

———
#chaining #constructor #this #super
@pieceJava
👍2