توابع Getter و setter در جاوا


توابع Getter و setter در جاوا
براي خريد اين درس نياز است وارد سايت شويد. در صورت نداشتن حساب کاربري عضو شويد.

تعریف کلاس ها به صورت دیگر، این گونه است که کلاس ها یک نوع داده جدید هستند؛ که توسط برنامه نویس تعریف میشود و از آن لحظه به بعد، به انواع داده‌ی ساده در جاوا اضافه میشود.
به طور ساده تر ما در جاوا با داده هایی از جنس: int ، float ، Boolean و... آشنا شده ایم که به آنها داده های پیچیده میگویند.
ما هرگاه نیاز داشته باشیم داده هایی غیر از این ها را نگهداری کنیم، حتما باید آن ها را تعریف کنیم؛ یعنی یک نوع داده جدید به سیستم اضافه کنیم.
مثلا در سیستم دانشگاه به عنوان یک دانشجو، نام و نام خانوادگی و بقیه اطلاعات مربوط به شما در سیستم باید کنار هم ذخیره شود.
اما اگر یک داده از نوع int برای نگهداری سن تعریف کرده ایم؛ این متغیر تنها میتواند مقدار سن را در خود نگهداری کند؛ و اگر بخواهیم نام خود را ذخیره کنیم باید یک متغیر از نوع String تعریف کنیم؛ این دو کاملا متفاوت و مجزا از هم هستند.
اما در محیط های کاربردی آیا واقعا به همین شکل است؟
یعنی شما داده هایتان به صورت مجزا و جدا از هم ذخیره میشود؟
قطعا به این شکل نیست؛ یعنی ما نیاز داریم که اگر بخواهیم اطلاعات یک دانشجو را نگهداری کنیم، همه‌ی اطلاعات این دانشجو کنار هم قرار بگیرند.
برای این کار از کلاس ها استفاده میکنیم که این قابلیت را دارند تا چندین نوع اطلاعات را در کنار یکدیگر ذخیره کنند.
وقتی که ما یک کلاس تعریف میکنیم؛ در واقع ظرف های متعددی از جنس های مختلف را کنار هم تعریف میکنیم.
خود این کلاس به عنوان یک نوع داده جدید به لیست ما اضافه میشود؛ از این لحظه به بعد ما میتوانیم از کلاس ها همانند متغییر ها استفاده کنیم.
برای درک بهتر این موضوع به مثال زیر دقت کنید:
فرض کنید قصد داریم اطلاعات یک فرد را نگهداری کنیم؛ اطلاعات این فرد شامل: نام، نام خانوادگی، سن و معدلش میباشد.
در اینجا ما چهار اطلاعات متفاوت از یک فرد را میخواهیم نگهداری کنیم؛ اگر قرار باشد این اطلاعات به صورت مجزا ذخیره شوند، ما باید برای هرکدام از اطلاعات یک متغییر تعریف کنیم.

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		String name;
		String family;
		int age;
		float avg;

	}

}

در کد بالا چهار متغییر تکی که هیچ رابطه ای با یکدیگر ندارند قرار است داده های ما را ذخیره کنند.
آیا واکشی این اطلاعات کار راحتی است؟ قطعا به این صورت نخواهد بود.
بهترین راه برای انجام این کار این است که ما یک ظرف یکجا داشته باشیم که این ظرف چند بخش داشته باشد؛ برای این کار ما باید یک کلاس تعریف کنیم. این ها کلاس های مدل ما هستند.
در این کلاس همان فیلد ها و اطلاعات مثال قبل را وارد میکنیم:

package package1;

public class Person {

	String name;
	String family;
	int age;
	float avg;

}

ما تا به اینجا انواع داده‌ی ساده را داشتیم یعنی در تابع Main میتوانستیم داده هایی از جنس int و... تعریف کنیم؛ اما حالا با این توضیحات میتوانیم یک شئ از کلاس مورد نظر تعریف کنیم.

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		int x;
		Person person1;

	}

}

ما وقتی مینویسیم:

int x;

 x یک متغییر از نوع int میباشد؛ اما اگر از یک کلاس یک متغییر تعریف کنیم، دیگر به آن متغییر گفته نمیشود و به آن شئ یا نمونه ای از کلاس گفته میشود.
متغییر ها و نمونه ها یک تفاوت مهم با هم دارند؛ متغییر ها در لحظه تعریف شدن از حافظه فضای خود را میگیرند. اما نمونه هایی که از کلاس ها تعریف میشوند، بعد از تعریف شدن باید درخواست بدهیم تا برای آن فضا اختصاص داده شود.
به روش زیر از مدیر حافظه برای نمونه درخواست فضا میکنیم:

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		int x;
		Person person1;
		person1 =new Person();

	}

}

وقتی که از کلمه کلیدی new استفاده میکنیم مدیر حافظه، فضایی را برای شئ یا نمونه‌ی ما در نظر میگیرد.
برای دسترسی به اعضای یک کلاس میتوانیم نام نمونه کلاس را بیاوریم و بعد از گذاشتن یک نقطه، آن بخش مورد نظر مثلا فیلد name را داشته باشیم؛ برای بهتر فهمیدن این موضوع به کد زیر توجه کنید:

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		int x;
		Person person1=new Person();
		person1.name="mehdi";

	}

}

یکی از بزرگترین ارزش هایی که کلاس ها به ما میدهند کپسوله سازی است؛
این ارزش امکان این را به ما میدهد که صفت های داخل یک کلاس از دید کلاس های دیگر مخفی بشوند.
در اکثر مواقع بهتر است که داده ها یا صفت های یک کلاس از دید کلاس های دیگر مخفی باشد؛ یعنی به صورت مستقیم نتوانیم از بیرون کلاس به آنها دسترسی داشته باشیم.
برای دسترسی به اعضای یک کلاس که در دید دیگر کلاسها مخفی شدند باید از یک سری واسطه ها استفاده کنیم.
به طور مثال ما برای صحبت با رئیس یک اداره، مستقیما نمی توانیم رئیس را ببینیم اما میشود یک سری واسطه ها را قرارداد که ما از طریق آنها که به صورت عمومی تعریف شده است بتوانیم به آن عضو خصوصی دست داشته باشیم.
به این صورت که ما باید  اول منشی رئیس را ببینیم.
پس باید عضوی در کلاس تعریف کنیم که بتواند دسترسی به اعضای خصوصی داشته باشد و ما هم بتوانیم آن را ببینیم یا به عبارتی نمونه کلاس بتواند آن را ببیند.
ابتدا یک متد تعریف میکنیم؛ این تابع دسترسی public یا عمومی دارد و هیچ خروجی ندارد.
کار این تابع این است که هر موقع آنرا صدا زدیم یک String برای آن می فرستیم که باید آن را گرفته و در متغییری به نام name قرار بدهد.
بر این متد ها متدهای مقدار دهی یا Setter میگویند.

کد کلاس Person:

package package1;

public class Person {

	String name;
	String family;
	int age;
	float avg;
	public void SetName(String n) {
		name=n;
	}
	
}

 

کد کلاس اصلی:

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		Person person1=new Person();
		person1.SetName("Mehdi");
		
	}

}


در کد بالا مشاهده کردید با این که سطح دسترسی در کلاس Person در حالت خصوصی میباشد در کلاس اصلی به راحتی میتوان به آن دسترسی پیدا کرد.
گاهی نیاز داریم اطلاعات خصوصی یک کلاس را بازیابی کنیم؛ در مرحله قبل ما اطلاعات را در نقش خصوصی ثبت کردیم اما حالا میخواهیم دیگر آن اطلاعات را بازیابی کنیم.
تابعی تعریف میکنیم که خروجی String دارد و نامش Getname است و همچنین ورودی ندارد.

برای درک بهتر به کد زیر دقت کنید:

کد کلاس Person:

package package1;

public class Person {

	private String name;
	private String family;
	int age;
	float avg;
	public void SetName(String n) {
		name=n;
	}
	public void SetFamily(String f) {
		family=f;
	}
	
	public String GetName() {
		return name;
	}
	public String GetFamily() {
		return family;
	}
	
}

 

کد کلاس اصلی:

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		Person person1=new Person();
		person1.SetName("Mehdi");
		person1.SetFamily("Abbasi");
		
		
		System.out.println(person1.GetName());
		System.out.println(person1.GetFamily());
		
	}

}


در بعضی برنامه ها ممکن است لازم باشد تعداد زیادی از متدهای Getter و Setter را بکار بگیریم و نوشتن این کدها ممکن است خیلی طولانی و خسته کننده باشد.
برای همین در بعضی از IDE ها این امکان را به وجود آورده تا بتوانیم به راحتی این کدها را تولید کنیم.
برای تولید Getter و Setter در Eclipse باید کلیدهای ترکیبی Alt+Shift+S را بزنیم و در پنجره ای باز میشود گزینه Generate Getter and Setter را  کلیک کنید.
پنجره ای که باز میشود که امکان انتخاب متغییر های مورد نظر را به ما میدهد تا کدهای Getter و Setter را اضافه کنیم. این کدها برای فراخوانی یک شی از یک کلاس دیگر است اما اگر مخواهیم یک شی دیگر را نیز فراخوانی کنیم هیچ مشکلی پیش نمی اید و تمام خانه ها و متغیر ها  که برای شی اول  تولید شده برای شی دوم هم تولید میشود. 

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


 


 

نظرات
مهدی موسوی
سیدمهدی موسوی سلام وقت بخیر ممکن به بخش بچهای جاوا کار ارجاع بدی تا تمرین حل کنم. تشکر از سایت خوبتون

برای پاسخ باید وارد شوید

پشتیبانی 1
پشتیبانی 1

سلام سید جان وقتتون بخیر، متوجه منظور شما نشدم! قراره چه چیزو به بچهای جاوا کار ارجاع بدهم؟

احمد طباطبایی
Ahmad سلام وقت بخیر ، من توی حوزه شبکه هستم و چند وقته دارم این فیلم ها رو مشاهده میکنم ، فقط توی سایت جایی برای انجام تمرین ندیدم ، چجوری تمرین کنم که دانسته هام و یادگیری هام ثبت و دایمی بشه ؟

برای پاسخ باید وارد شوید

پشتیبانی 1
پشتیبانی 1

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

nophoto
امیر مهر عالی بود مخصوصا روشتون که با تشبیه به اتفاقات روزمره آموزش دادین تا ملموس تر باشه

برای پاسخ باید وارد شوید

پشتیبانی 1
پشتیبانی 1

سلام امیر جان خوب هستید؟ مچکرم از لطف شما، ما برای خواسته های شما ارزش قائلیم و آموزش های کم نظیری تولید می کنیم، همانند خودتان که نظیر ندارید.

nophoto
کامیار "گاهی نیاز داریم اطلاعات خصوصی یک کلاس را بازیابی کنیم؛ در مرحله قبل ما اطلاعات را در نقش خصوصی ثبت کردیم اما حالا میخواهیم دیگر آن اطلاعات را بازیابی کنیم." این بخش رو متوجه نشدم ممنون میشم یه توضیح کوچولو بدین و اینکه نوشتین در مرحله قبل ما اطلاعات را در نقش خصوصی ثبت کردیم درصورتی که همه شون default بودن یکم گیج شدم !!!!!!!!!!!

برای پاسخ باید وارد شوید

پشتیبانی 1
پشتیبانی 1

برای بازیابی اطلاعات خصوصی (مقادیر فیلدهای خصوصی) ما توابع getter استفاده می کنیم که توابعی هستند عمومی (public) و کارشون بازیابی مقدار یکی از فیلدهای خصوصیه.

اینکه ما اونهارو default در نظر گرفتیم فقط به خاطر این بود که داریم تمرین می کنیم ولی بهتره که private باشند.

موفق باشید.

nophoto
کامیار چرا از GetName استفاده می کنیم وقتی میشه تو تابع SetName از دستور out.print استفاده کرد ؟

برای پاسخ باید وارد شوید

پشتیبانی 1
پشتیبانی 1

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

ع ک
عاطفه واقعا واقعااا عالی بود... من خیلی وقت بود که روی مباحث شی گرایی مشکل داشتم و منبع فارسی خوب رایگان پیدا نمیکردم واقعا ممنونمممم

برای پاسخ باید وارد شوید

پشتیبانی 1
پشتیبانی 1

سلام و درود خدمت شما، ممنون از حس خوبتون نسبت به آموزش ما.

موفق باشید.


نظر بدهید نشانی ایمیل شما منتشر نخواهد شد .
برای ارسال نظر نیاز است وارد سایت شوید. در صورت نداشتن حساب کاربری عضو شوید.


مشخصات دوره


مدرس دوره : مهدی عباسی
تعداد جلسات 26 جلسه
مدت زمان 742 دقیقه
حجم دوره 1/84 گیگابایت
سطح مهارت مقدماتی تا متوسط
وضعیت دوره پایان یافته
تعداد دانشجویان 2542
: میانگین امتیاز

رایگان
برای دسترسی به این دوره وارد یا عضو شوید.
مهدی عباسی

مهدی عباسی


درباره مدرس :

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

آموزش جاوا پیشرفته
4.38
508
1332
900,000 25% تخفیف 1,200,000
جزئیات دوره
آموزش سی شارپ مقدماتی تا متوسط
4.41
1719
1119

رایگان

جزئیات دوره
آموزش جاوا مقدماتی تا متوسط، کاملا رایگان
4.40
2542
742

رایگان

جزئیات دوره
آموزش سی شارپ پیشرفته، ویژه ورود به بازار کار

آموزش سی شارپ پیشرفته

مدرس : مهدی عباسی


4.73
742
1091
475,000
جزئیات دوره
آموزش سی پلاس پلاس پیشرفته
4.71
469
621
135,000
جزئیات دوره