Saturday, January 28, 2017

জাভাতে প্রাইভেট ফিল্ড(private field) প্রয়োজন কেনো? এগুলো অ্যাকসেস করার জন্য গেটার সেটার কেনো ব্যবহার করা হয় ?

এর প্রয়োজনীয়তা বুঝতে হলে আগে এনক্যাপসুলেশনের(encapsulation) প্রয়োজনীয়তা বুঝতে হবে। ধরা যাক, একটি ক্লাসে একটি ভ্যারিয়েবল আছে, সেই ভ্যারিয়েবলের ভিত্তিতে ক্লাসটি কিছু সিন্ধান্ত নেয়। ক্লাসটিতে অনেকগুলো মেথডও রয়েছে, এগুলো দিয়ে কিছু কাজ করা যায়। আপনার এই ক্লাসটির নিশ্চয় কেউ ব্যবহার করবে। এই ভ্যারিয়েবলটি যদি পাবলিক(public) হয়, তাহলে যে এই ক্লাসটি ব্যবহার করছে সে চাইলেই পরিবর্তন করে দিতে পারবে। ইচ্ছাকৃতভাবে পরিবর্তন না করে ভুল করেও করতে পারে। এই পরিবর্তনের ফলে ক্লাসটি যে কাজগুলো করছে তার লজিকের ভুল হতে পারে। এখন এই কাজটি যাতে না করতে পারে সেজন্য এই ভেরিয়েবলটিকে প্রাইভেট(private) করে দিলেই সমস্যা সমস্যাটি সমাধান হয়ে যায়। অন্যদিকে, ব্যবহারকারী সেই ভ্যারিয়েবলের ভ্যালুটি পড়ার দরকার হতে পারে। যেহেতু ভেরিয়েবলটি প্রাইভেট(private), তাই এটিকে সরাসরি পড়ার উপায় নেই। এই উপায় বের করার জন্যে এতে একটি গেটার মেথড যুক্ত করা যেতে পারে। এভাবে একটি ক্লাসে যদি সেটার থাকে তাহলে যে ভ্যালু সেট করছে সে নিশ্চিত হয়ে ভ্যালু সেট করবে। ভুলক্রমে ভ্যালু পড়তে গিয়ে সেট করার সম্ভবনা কমে যায় এতে।
এছাড়ারও আরও বেশ কিছু কারণ রয়েছে, তবে এগুলোকে সঠিক ভাবে ব্যবহার করায় উত্তম, অর্থাৎ যেখানে যেভাবে লাগে। এগুলো হলো -
  • ১. আপনি একটি ক্লাসকে রিডওনলি(read only) করতে পারে। অর্থাৎ ক্লাসের ভ্যালুগুলো শুধু পড়া যাবে। এক্ষেত্রে সেই ক্লাসে শুধুমাত্রে গেটার(getter) থাকবে।
  • ২. আপনি একটি ক্লাসকে কনফিগারেবল (configurable) করতে চাইতে পারেন। অর্থাৎ ভ্যালু সেট করবে। সেক্ষেত্রে আপনি শুধু সেটার রাখতে পারেন।
  • ৩. একটি গেটার যে শুধুমাত্র একটি ভেরিয়েবল থাকে ডাটা পড়ে রিটার্ন করবে এমনটি নাও হতে পারে। অনেকগুলো ভেরিয়েবল থেকে ডেটা কম্পিউট করে রিটার্ন করতে পারে।
  • ৪. মনে করুন আপনি ভ্যালু সেট করতে চান যা একটি নির্দিষ্ট রেঞ্জের হবে। এই রেঞ্জের বাইরে কোন ভ্যালু দিলে তা সেটার থেকে একসেপশন থ্রুক করতে পারেন।
একটি উদাহরণ দেওয়া যাক -
    public class Measurement{

    /**
     * The distance in centimeters.
     */
    private double distance;

    /**
     * Gets the distance in inches.
     * @return A distance value.
     */
    public double getDistance()
    {
        return distance / 2.54;
    }

    /**
     * Sets the distance.
     * @param distance The distance, in inches.
     */
    public void setDistance(double distance)
    {
        this.distance = distance * 2.54;
    }
}
এছাড়াও এটি একটি good practice (উত্তম উপায়)। উত্তম উপায় অভ্যাস করায় শ্রেয়।