Encapsulation and Access Modifiers


ধরো তোমার কার কোম্পানিতে কয়েক জন ডিজাইনার আছে এবং তারা সবাই বেসিক কারের ডিজাইন থেকে নতুন নতুন ডিজাইন তৈরী করে। এখন তুমি চাচ্ছ বেসিক কারের যে ডিজাইন আছে তা থেকে বেশির ভাগ জিনিসই তারা নিতে পারবে কিন্তু কিছু কিছু ডিজাইন তাদের কাছ থেকে গোপন রাখবে।

তাহলে এই ব্যাপারটা আমাদের প্রোগ্রামিং এ কেমন দাঁড়ায় আসলে। আমাদের একটি BasicCar ক্লাশ আছে এবং ডিজাইনাররা নতুন একটি ক্লাশ তৈরী করার সময় BasicCar ক্লাশটিকে Extend করে এবং BasicCar ক্লাশের সবগুলো মেথড এবং ভেরিয়েবল পেয়ে যায়। কিন্তু আমরা চাচ্ছি যে তারা যখন আমাদের BasicCar ক্লাশটিকে Extend করে নতুন একটি ক্লাশ বানাবে তখন তারা যেন কিছু কিছু মেথড এবং ভেরিয়েবলে এ্যাকসেস না পায়।

এই যে চাইল্ড ক্লাশের কাছে প্যারেন্ট ক্লাশের কিছু কিছু ভেরিয়েবল এবং মেথড, এবং সেই সাথে ক্লাশের কন্সট্রাকটর(Constructor)[এটি একটু পরেই আলোচনা করা হবে] এবং ক্লাশ নিজেকে গোপন রাখা এটাই হলো প্রোগ্রামিং এর ভাষায় এনক্যাপসুলেশন (Encapsulation)।

আর এনক্যাপসুলেশন(Encapsulation) ইমপ্লিমেন্ট করার জন্য জাভাতে Access Modifier ব্যবহার করা হয়। কয়েক ধরণের Access Modifier আছে জাভাতে। যেমন:

  • private

  • public

  • protected

 

প্রাইভেট(private):

প্রথমেই প্রাইভেট(private) নিয়ে আলোচনা শুরু করি।

 

ভেরিয়েবলের ক্ষেত্রে:

যখনই তুমি কোন ক্লাশের কোন ভেরিয়েবলকে private করে দেবে তখন ওই ভেরিয়েবলটি শুধু ওই ক্লাশের মধ্যেই এ্যাকসেসেবল হবে কিন্তু অন্য কোন ক্লাশ যদি ওই ক্লাশকে Extend করে তাহলে ওই প্রাইভেট ভেরিয়েবলকে এ্যাকসেস করতে পারবে না। কোন ভেরিয়েবলকে প্রাইভেট করে দেবার নিয়ম হল এরকম:




ভেরিয়েবলটির সর্বাগ্রে শুধু private কথাটা লিখে দিতে হবে।

এখন আমরা এই একই ক্লাশ থেকে wheel ভেরিয়েবলটিকে এ্যাকসেস করার চেষ্টা করি।

 

BasicCar ক্লাশে showWheel এই মেথডের মাধ্যমে wheel নামের private ভেরিয়েবলটিকে এ্যাকসেস করার চেষ্টা করলাম।




এবং BasicCar ক্লাশের একটি অবজেক্ট বানিয়ে মেথডটিকে কল করলাম




আউটপুট:




 

এখন আমরা private ভেরিয়েবল wheel কে চাইল্ড ক্লাশ থেকে এ্যাকসেস করার চেষ্টা করি।




দেখো আমাদেরকে চাইল্ড ক্লাশ থেকে প্যারেন্ট ক্লাশের wheel ভেরিয়েবলটিকে এ্যাকসেস করতে দিচ্ছে না। এখানে আবার খেয়াল রেখো যে আমরা তো আগের প্র্যাকটিসে BronoxCar ক্লাশে wheel ভেরিয়েবলটির নতুন ভ্যালু সেট করেছিলাম। তাই আগে সেটিকে উপরের মতো কমেন্ট করে নিও।

 

মেথডের ক্ষেত্রে:

মেথডের ক্ষেত্রেও একই ব্যাপার। তুমি প্যারেন্ট ক্লাশে কোন মেথডকে private করলে শুধু ওই ক্লাশ থেকেই মেথডটিকে কল করতে পারবে, চাইল্ড ক্লাশ থেকে কল করতে পারবে না। আর মেথডকে private করার জন্য মেথডের সর্বাগ্রে private কথাটি লিখে দিতে হবে।




এখন যদি চাইল্ড ক্লাশ থেকে কল করতে যাই:




অর্থাৎ তুমি এ্যাকসেস করতে পারবে না।

 

ক্লাশের ক্ষেত্রে:

ক্লাশকে কখনো তুমি private করতে পারবে না।

 

পাবলিক(public):

publice মডিফায়ারটি private এর একদম উল্টো। অর্থাৎ যদি তুমি কোন মেথড বা ভেরিয়েবলকে public করে দাও তাহলে তুমি সেটাকে যে কোন চাইল্ড ক্লাশ থেকে এ্যাকসেস করতে পারবে।

 

প্রটেকটেড(Protected):

এটা বোঝা তোমাদের জন্য একটু কঠিন হয়ে যেতে পারে। তাই আপাতত আমরা এটি বাদ রাখছি এই মুহূর্তে। পরের আপডেটে এটি আলাদা চ্যাপ্টার করা হবে।

 

আর হ্যাঁ, আমরা inheritance চ্যাপ্টারে যে বলেছিলাম কোন চাইল্ড ক্লাশকে কোন প্যারেন্ট ক্লাশ থেকে extend করলে সেই চাইল্ড ক্লাশটি প্যারেন্ট ক্লাশের সব মেথড ও ভেরিয়েবলকে পেয়ে যায়। কথাটা আংশিক মিথ্যা ছিলো। এখন আশা করি বুঝেছো যে শুধু পাবলিকগুলোই পাবে।