اعضای دادهای خصوصی (private) یک کلاس تنها توسط توابع عضو آن کلاس قابل دسترسی هستند. بنابراین هر کلاس یا تابعی که از توابع عضو یک شی استفاده میکند و آن را از خارج از شی فراخوانی میکند، تنها میتواند توابع عمومی (public) عضو کلاس را به منظور درخواست سرویسهای کلاس از هر شی خاص فراخوانی نماید.
در برنامهنویسی شیگرا کلاسها از توابع عضو عمومی برای انجام عمل set (یعنی نسب دادن مقدار به) و get (یعنی به دست آوردن مقدار از) برای دسترسی به اعضای دادهای خصوصی کلاس استفاده میکنند. این نامگذاری یک قرارداد متداول است و حتما لازم نیست نام این توابع عضو با set یا get آغاز گردد. توابع set گاهی اوقات تغییردهنده (mutator) نامیده میشوند (زیرا آنها مقادیر را تغییر میدهند). همچنین توابع get نیز گاهی اوقات دستیابنده (accessor) نامیده میشوند (زیرا آنها مقادیر را بازیابی مینمایند).
از طریق توابع set و get میتوان دسترسی استفادهکنندگان از دادههای خصوصی یک شی را کنترل نمود. این ویژگی اهمیت زیادی در مهندسی نرمافزار دارد زیرا اعلان اعضای دادهای با سطح دسترسی خصوصی منجر به رعایت اصل پنهانسازی داده (encapsulation) میشود. اگر توابع set و get را بهصورت عمومی در اختیار سایرین قرار دهیم استفادهکنندگان یک کلاس تنها به صورت غیرمستقیم میتوانند به دادههای خصوصی کلاس دستیابی داشته باشند. استفادهکنندگان از کلاس فقط میتوانند دادههای یک شی را تغییر داده یا آن را بازیابی کند و از نحوهی انجام این کار اطلاعی نداشته باشند. در برخی موارد، ممکن است نحوهی استفادهی داخلی یک کلاس از یک عضو دادهای و کاری که بر روی آن انجام میدهد، با طرز ارائهی آن به استفاده کننده از آن داده و نحوهی نمایش آن، بسیار متفاوت باشد. توابع set و get به استفادهکنندگان کلاس امکان تعامل با شی را میدهند، اما دادههای خصوصی به شکل ایمن در خود شی، بهصورت پنهان (encapsulated) باقی میمانند.
به عنوان مثال کلاس Customer یک عضو دادهای به نام name داشته و از آنها برای نگهداری نام مشتری هر شی خاصی از کلاس Customer استفاده میکند. کلاس مزبور حاوی توابع عضو setName و getName میباشد. تابع عضو setName نام مشتری را در یک عضو داده از کلاس Customer ذخیره مینماید – تابع عضو getName نام مشتری را در یک عضو دادهای از کلاس Customer بازیابی میکند.
1public class Customer {
2 private String name;
3
4 // Getter
5 public String getName() {
6 return name;
7 }
8
9 // Setter
10 public void setName(String newName) {
11 this.name = newName;
12 }
13}
شاید فکر کنید که حتی اگر اعضای دادهای به صورت خصوصی تعریف شوند، استفادهکنندگان همچنان میتوانند هر زمان که بخواهند به کمک توابع set و get آنها را بخوانند و دستکاری کنند، پس فایدهی این مخفیکاری چیست؟! جواب این است که توابع set را میتوان طوری نوشت که دادههای ورودی به اعضای دادهای را کنترل و فیلتر کنند و به هر دادهای اجازهی نوشتهشدن در اعضای دادهای را ندهند. همچنین میتوان به کمک تابع get قالب نمایش دادهها را کنترل نمود.
برای مثال میتوانید به کمک تابع set از نوشته شدن مقادیر منفی در عضو دادهای “نمره” جلوگیری نمایید.
1public class Grade {
2 private int theGrade;
3
4 // Getter
5 public int getGrade() {
6 return theGrade;
7 }
8
9 // Setter
10 public void setAge(int newGrade) {
11 if(newGrade > 0)
12 this.theGrade = newGrade;
13 }
14}
برای مثال دیگر میتوانید عضو دادهای “نمره” را به صورت کیفی با یک رشته (“عالی”، “خوب”، “متوسط”، “قابل قبول” و “مردود”) بازیابی نمایید.
1public class Grade {
2 private int theGrade;
3
4 // Getter
5 public String getGrade() {
6 if(theGrade >= 80)
7 return "Excellent";
8 else if(theGrade >= 60 and theGrade < 80)
9 return "Good";
10 else if(theGrade >= 50 and theGrade < 60)
11 return "Average";
12 else if(theGrade >= 40 and theGrade < 50)
13 return "Acceptable";
14 else if(theGrade < 40)
15 return "Fail";
16 else
17 return "Invalid grade";
18 }
19
20 // Setter
21 public void setAge(int newGrade) {
22 if(newGrade > 0)
23 this.theGrade = newGrade;
24 }
25}
هرچند که توابع عضو درون کلاس میتواند دادههای خصوصی را مستقیما مورد دستیابی قرار دهند، اما بهتر است این توابع نیز برای ادارهی دادههای خصوصی کلاس از توابع set و get استفاده کنند. به عنوان مثال تابع displayMessage یک پیغام مبنی بر معرفی مشتری که نام و سن مشتری در آن است را در خروجی نمایش میدهد.
1public class Customer {
2 private String name;
3 private int age;
4
5 // Getter
6 public String getName() {
7 return name;
8 }
9
10 // Setter
11 public void setName(String newName) {
12 this.name = newName;
13 }
14
15 // Getter
16 public int getAge() {
17 return age;
18 }
19
20 // Setter
21 public void setAge(int newAge) {
22 this.age = newAge;
23 }
24
25 public String displayMessage() {
26 return "My name is " + getName() + ". I am " + getAge() + "years old.";
27 }
28}
کنترل مقادیر ورودی به اعضای دادهای و قالببندی نمایش آنها میتواند تاثیر بهسزایی در کاهش خطاها و خوانایی برنامه داشته باشد و پایداری و امنیت برنامه را بالا ببرد.