CodeGym /Java Blog /এলোমেলো /Getters এবং setters
John Squirrels
লেভেল 41
San Francisco

Getters এবং setters

এলোমেলো দলে প্রকাশিত
হ্যালো! পূর্ববর্তী লেকশনগুলিতে, আপনি ইতিমধ্যে শিখেছেন কিভাবে পদ্ধতি এবং ক্ষেত্র সহ আপনার নিজস্ব পূর্ণাঙ্গ ক্লাস ঘোষণা করতে হয়। আজকের পাঠে, আমরা জাভাতে Getters এবং Setters সম্পর্কে কথা বলব। এটি একটি গুরুতর অগ্রগতি, ভাল কাজ! কিন্তু এখন আমাকে একটা অপ্রিয় সত্য বলতে হবে। আমরা আমাদের ক্লাস সঠিকভাবে ঘোষণা করিনি! কেন? প্রথম দর্শনে, নিম্নলিখিত ক্লাসে কোন ভুল নেই:

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}
কিন্তু এটা করে। কল্পনা করুন আপনি কর্মক্ষেত্রে বসে আছেন এবং বিড়ালদের প্রতিনিধিত্ব করতে এই বিড়াল শ্রেণীটি লিখুন। এবং তারপর আপনি বাড়িতে যান. আপনি চলে যাওয়ার সময়, অন্য একজন প্রোগ্রামার কর্মস্থলে আসে। সে তার নিজের মেইন ক্লাস তৈরি করে, যেখানে সে আপনার লেখা ক্যাট ক্লাস ব্যবহার করতে শুরু করে ।

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
কেন তিনি এটি করেছিলেন এবং কীভাবে এটি ঘটেছিল তা বিবেচ্য নয় (হয়তো লোকটি ক্লান্ত বা পর্যাপ্ত ঘুম পায়নি)। অন্য কিছু গুরুত্বপূর্ণ: আমাদের বর্তমান ক্যাট ক্লাস ক্ষেত্রগুলিকে একেবারে উন্মাদ মান বরাদ্দ করার অনুমতি দেয়। ফলস্বরূপ, প্রোগ্রামটিতে একটি অবৈধ অবস্থা সহ বস্তু রয়েছে (যেমন এই বিড়ালটি -1000 বছর বয়সী)। তাই আমাদের ক্লাস ঘোষণা করার সময় আমরা কি ত্রুটি করেছি? আমরা আমাদের ক্লাসের তথ্য প্রকাশ করেছি। নাম, বয়স এবং ওজন ক্ষেত্র সর্বজনীন। এগুলি প্রোগ্রামের যে কোনও জায়গায় অ্যাক্সেস করা যেতে পারে: কেবল একটি ক্যাট অবজেক্ট তৈরি করুন এবং যেকোন প্রোগ্রামারের ডট ( . ) অপারেটরের মাধ্যমে এর ডেটাতে সরাসরি অ্যাক্সেস রয়েছে

Cat cat = new Cat();
cat.name = "";
এখানে আমরা সরাসরি নাম ক্ষেত্র অ্যাক্সেস করছি এবং এর মান নির্ধারণ করছি। আমাদের কোনো না কোনোভাবে আমাদের ডেটাকে অনুপযুক্ত বাহ্যিক হস্তক্ষেপ থেকে রক্ষা করতে হবে। আমরা যে কি করতে হবে? প্রথমত, সমস্ত ইনস্ট্যান্স ভেরিয়েবল (ক্ষেত্র) অবশ্যই প্রাইভেট মডিফায়ার দিয়ে চিহ্নিত করতে হবে। প্রাইভেট হল জাভাতে সবচেয়ে কঠোর অ্যাক্সেস মডিফায়ার। একবার আপনি এটি করলে, ক্যাট ক্লাসের ক্ষেত্রগুলি ক্লাসের বাইরে অ্যাক্সেসযোগ্য হবে না।

public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";//error! The Cat class's name field is private!
   }
}
কম্পাইলার এটি দেখে এবং অবিলম্বে একটি ত্রুটি তৈরি করে। এখন মাঠগুলো একরকম সুরক্ষিত। কিন্তু দেখা যাচ্ছে যে আমরা সম্ভবত খুব শক্তভাবে অ্যাক্সেস বন্ধ করে দিয়েছি: আপনি প্রোগ্রামে বিদ্যমান বিড়ালের ওজন পেতে পারবেন না, এমনকি যদি আপনার প্রয়োজন হয়। এটিও একটি বিকল্প নয়। এটা যেমন, আমাদের ক্লাস মূলত অব্যবহারযোগ্য. আদর্শভাবে, আমাদের কিছু ধরণের সীমিত অ্যাক্সেসের অনুমতি দিতে হবে:
  • অন্যান্য প্রোগ্রামারদের বিড়াল বস্তু তৈরি করতে সক্ষম হওয়া উচিত
  • তারা বিদ্যমান বস্তু থেকে ডেটা পড়তে সক্ষম হওয়া উচিত (উদাহরণস্বরূপ, একটি বিদ্যমান বিড়ালের নাম বা বয়স পান)
  • ক্ষেত্রের মান নির্ধারণ করাও সম্ভব হওয়া উচিত। কিন্তু এটি করার সময়, শুধুমাত্র বৈধ মান অনুমোদিত হওয়া উচিত। আমাদের বস্তুগুলিকে অবৈধ মান (যেমন বয়স = -1000, ইত্যাদি) থেকে সুরক্ষিত করা উচিত।
এটি প্রয়োজনীয়তার একটি শালীন তালিকা! বাস্তবে, গেটার এবং সেটার্স নামক বিশেষ পদ্ধতির মাধ্যমে এই সমস্ত সহজেই অর্জন করা যায়।
গেটার এবং সেটার্স - 2
এই নামগুলি "গেট" (অর্থাৎ "ক্ষেত্রের মান পাওয়ার পদ্ধতি") এবং "সেট" (অর্থাৎ "ক্ষেত্রের মান নির্ধারণের পদ্ধতি") থেকে এসেছে। আসুন দেখি আমাদের ক্যাট ক্লাসে এগুলি কেমন দেখায় :

public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       this.weight = weight;
   }
}
আপনি দেখতে পাচ্ছেন, এগুলি দেখতে বেশ সহজ :) তাদের নাম প্রায়ই "get"/"set" প্লাস প্রাসঙ্গিক ক্ষেত্রের নাম নিয়ে গঠিত। উদাহরণস্বরূপ, getWeight() পদ্ধতিটি যে বস্তুটির উপর কল করা হয়েছে তার ওজন ক্ষেত্রের মান প্রদান করে। এটি একটি প্রোগ্রামে কেমন দেখায় তা এখানে:

public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       String smudgeName = smudge.getName();
       int smudgeAge = smudge.getAge();
       int smudgeWeight = smudge.getWeight();

       System.out.println("Cat's name: " + smudgeName);
       System.out.println("Cat's age: " + smudgeAge);
       System.out.println("Cat's weight: " + smudgeWeight);
   }
}
কনসোল আউটপুট:
Cat's name: Smudge
Cat's age: 5
Cat's weight: 4
এখন অন্য ক্লাস ( প্রধান ) ক্যাট ক্ষেত্রগুলি অ্যাক্সেস করতে পারে , তবে শুধুমাত্র গেটারের মাধ্যমে। লক্ষ্য করুন যে গেটারদের পাবলিক অ্যাক্সেস মডিফায়ার থাকে, অর্থাৎ তারা প্রোগ্রামের যেকোনো জায়গা থেকে পাওয়া যায়। কিন্তু মান নির্ধারণ সম্পর্কে কি? এই জন্য সেটার পদ্ধতি কি

public void setName(String name) {
   this.name = name;
}
আপনি দেখতে পারেন, তারা এছাড়াও সহজ. আমরা একটি Cat অবজেক্টে setName() পদ্ধতিকে কল করি , একটি আর্গুমেন্ট হিসাবে একটি স্ট্রিং পাস করি এবং স্ট্রিংটি অবজেক্টের নামের ক্ষেত্রে বরাদ্দ করা হয়।

public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);

       System.out.println("Cat's original name: " + smudge.getName());
       smudge.setName("Mr. Smudge");
       System.out.println("Cat's new name: " + smudge.getName());
   }
}
এখানে আমরা গেটার এবং সেটার উভয়ই ব্যবহার করছি। প্রথমত, আমরা বিড়ালের আসল নাম পেতে এবং প্রদর্শন করতে একটি গেটার ব্যবহার করি। তারপর, আমরা একটি নতুন নাম বরাদ্দ করার জন্য একটি সেটার ব্যবহার করি ("মিস্টার স্মুজ")। এবং তারপরে আমরা নাম পেতে আবার গেটার ব্যবহার করি (এটি সত্যিই পরিবর্তিত হয়েছে কিনা তা পরীক্ষা করতে)। কনসোল আউটপুট:
Cat's original name: Smudge
Cat's new name: Mr. Smudge
তাহলে পার্থক্য কি? সেটার থাকলেও আমরা ক্ষেত্রগুলিতে অবৈধ মান নির্ধারণ করতে পারি:

public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
কনসোল আউটপুট:
Smudge's age: -1000 years
পার্থক্য হল একটি সেটার একটি পূর্ণাঙ্গ পদ্ধতি। এবং একটি ক্ষেত্রের বিপরীতে, একটি পদ্ধতি আপনাকে অগ্রহণযোগ্য মান প্রতিরোধ করার জন্য প্রয়োজনীয় যাচাইকরণ যুক্তি লিখতে দেয়। উদাহরণস্বরূপ, আপনি সহজেই একটি নেতিবাচক সংখ্যাকে বয়স হিসাবে বরাদ্দ করা থেকে আটকাতে পারেন:

public void setAge(int age) {
   if (age >= 0) {
       this.age = age;
   } else {
       System.out.println("Error! Age can't be negative!");
   }
}
এবং এখন আমাদের কোড সঠিকভাবে কাজ করে!

public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
কনসোল আউটপুট:
Error! Age can't be negative!
Smudge's age: 5 years
সেটারের ভিতরে, আমরা একটি সীমাবদ্ধতা তৈরি করেছি যা আমাদেরকে অবৈধ ডেটা সেট করার প্রচেষ্টা থেকে রক্ষা করেছে। Smudge এর বয়স পরিবর্তন করা হয় নি. আপনার সর্বদা গেটার এবং সেটার তৈরি করা উচিত। আপনার ক্ষেত্রগুলি কী মান নিতে পারে তার উপর কোনও সীমাবদ্ধতা না থাকলেও, এই সহায়ক পদ্ধতিগুলি কোনও ক্ষতি করবে না। নিম্নলিখিত পরিস্থিতি কল্পনা করুন: আপনি এবং আপনার সহকর্মীরা একসাথে একটি প্রোগ্রাম লিখছেন। আপনি পাবলিক ক্ষেত্রগুলির সাথে একটি বিড়াল শ্রেণী তৈরি করুন৷ সমস্ত প্রোগ্রামাররা তাদের ইচ্ছামত ব্যবহার করছে। এবং তারপরে একদিন আপনি বুঝতে পারবেন: "বাঁকা, শীঘ্রই বা পরে কেউ ভুলবশত ওজনের জন্য একটি নেতিবাচক সংখ্যা নির্ধারণ করতে পারে! আমাদের সেটার তৈরি করতে হবে এবং সমস্ত ক্ষেত্র ব্যক্তিগত করতে হবে!" আপনি ঠিক তাই করেন, এবং আপনার সহকর্মীদের দ্বারা লিখিত সমস্ত কোড অবিলম্বে ভেঙে ফেলুন। সর্বোপরি, তারা'বিড়াল ক্ষেত্র সরাসরি.

cat.name = "Behemoth";
এবং এখন ক্ষেত্রগুলি ব্যক্তিগত এবং কম্পাইলার একগুচ্ছ ত্রুটি দেখায়!

cat.name = "Behemoth";//error! The Cat class's name field is private!
এই ক্ষেত্রে, ক্ষেত্রগুলি লুকিয়ে রাখা এবং প্রথম থেকেই গেটার এবং সেটার তৈরি করা ভাল হবে। আপনার সব সহকর্মী তাদের ব্যবহার করা হবে. এবং যদি আপনি বিলম্বে উপলব্ধি করেন যে আপনাকে কোনওভাবে ক্ষেত্রের মানগুলিকে সীমাবদ্ধ করতে হবে, আপনি সেটারের ভিতরে চেকটি লিখতে পারতেন। এবং কারও কোড ভাঙা হবে না। অবশ্যই, আপনি যদি একটি ক্ষেত্রে অ্যাক্সেস করতে চান তবে শুধুমাত্র "পড়ুন", আপনি এটির জন্য শুধুমাত্র একটি গেটার তৈরি করতে পারেন। শুধুমাত্র পদ্ধতিগুলি বাহ্যিকভাবে উপলব্ধ হওয়া উচিত (যেমন আপনার ক্লাসের বাইরে)। ডেটা লুকানো উচিত। আমরা একটি মোবাইল ফোনের সাথে তুলনা করতে পারি। কল্পনা করুন যে সাধারণ আবদ্ধ মোবাইল ফোনের পরিবর্তে, আপনাকে একটি খোলা কেস সহ একটি ফোন দেওয়া হয়েছিল, যার মধ্যে সমস্ত ধরণের প্রসারিত তার, সার্কিট ইত্যাদি রয়েছে৷ কিন্তু ফোন কাজ করে: আপনি যদি সত্যিই কঠোর চেষ্টা করেন এবং সার্কিটগুলিকে খোঁচা দেন, তাহলে আপনিও হতে পারেন একটি কল করতে সক্ষম। কিন্তু তুমি'
গেটার এবং সেটার্স - 3
পরিবর্তে, প্রস্তুতকারক আপনাকে একটি ইন্টারফেস দেয়: ব্যবহারকারী কেবল সঠিক সংখ্যাগুলি প্রবেশ করে, সবুজ কল বোতাম টিপে এবং কল শুরু হয়। সার্কিট এবং তারের সাথে ভিতরে কী ঘটে বা কীভাবে তারা তাদের কাজটি সম্পন্ন করে সে বিষয়ে তিনি কিছু চিন্তা করেন না। এই উদাহরণে, কোম্পানি ফোনের "ভিতরে" (ডেটা) অ্যাক্সেস সীমিত করে এবং শুধুমাত্র একটি ইন্টারফেস (পদ্ধতি) প্রকাশ করে। ফলস্বরূপ, ব্যবহারকারী যা চেয়েছিলেন তা পান (একটি কল করার ক্ষমতা) এবং অবশ্যই ভিতরে কিছু ভাঙবে না। আপনি যা শিখেছেন তা শক্তিশালী করার জন্য, আমরা আপনাকে আমাদের জাভা কোর্স থেকে একটি ভিডিও পাঠ দেখার পরামর্শ দিই
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION