CodeGym /Java Blog /এলোমেলো /জাভা স্কোপ
John Squirrels
লেভেল 41
San Francisco

জাভা স্কোপ

এলোমেলো দলে প্রকাশিত
আমরা সবাই জানি যে দেশের সীমানা এবং তাদের নিজস্ব আইন আছে। দেশের আইন সীমানার মধ্যে চলে। এছাড়াও দেশে রয়েছে, উদাহরণস্বরূপ, স্কুল বা জাদুঘরের মতো সংগঠন, যাদের নিজস্ব স্থানীয় নিয়ম রয়েছে। তারা দেশের আইনের বিরোধিতা করে না, তবে শুধুমাত্র নির্দিষ্ট সংস্থার কাঠামোর মধ্যে কাজ করে। প্রোগ্রামিং এর ক্ষেত্রেও তাই। সুতরাং প্রোগ্রামিং এবং বিশেষ করে জাভা ভাষায় একটি শব্দ "স্কোপ" আছে। এটি প্রোগ্রামের ক্ষেত্রগুলিকে বোঝায় যেখানে নির্দিষ্ট ডেটা, যেমন ভেরিয়েবল বা পদ্ধতিগুলি কাজ করে। এই নিবন্ধে, আমরা জাভাতে ভেরিয়েবলগুলির জন্য কী কী সুযোগ রয়েছে এবং কীভাবে সেগুলিকে সংজ্ঞায়িত করা যায় তা খুঁজে বের করতে যাচ্ছি।

সাধারণভাবে জাভা স্কোপ

ভেরিয়েবল এবং পদ্ধতির স্কোপ আলাদা করার প্রয়োজন কেন? সত্য যে কখনও কখনও প্রোগ্রামগুলি খুব বড় হয় এবং এটি এক বা অন্য পরিবর্তনশীল ট্র্যাক করা কঠিন হতে পারে। উপরন্তু, বড় প্রকল্পে, ভেরিয়েবলের পরিষ্কার নামকরণ বাঞ্ছনীয় যাতে তারা কিসের জন্য তা স্পষ্ট হয়। স্কোপ বিশেষভাবে আপনাকে প্রোগ্রামের বিভিন্ন অংশে একই নামের বিভিন্ন ভেরিয়েবল থাকতে দেয়। এই ধরনের কোড বজায় রাখা এবং পড়া সহজ. জাভা স্কোপ সংজ্ঞায়িত করে যেখানে একটি নির্দিষ্ট ভেরিয়েবল বা পদ্ধতি একটি প্রোগ্রামে অ্যাক্সেসযোগ্য। সংক্ষেপে:
  • একটি পদ্ধতিতে ঘোষিত একটি পরিবর্তনশীল ঘোষণার শুরু থেকে পদ্ধতির শেষ পর্যন্ত দৃশ্যমান (পদ্ধতির সুযোগ)।
  • কোড ব্লকে ঘোষিত একটি ভেরিয়েবল সেই কোড ব্লকের শেষ না হওয়া পর্যন্ত বিদ্যমান থাকে।
  • ভেরিয়েবল যেগুলি মেথড আর্গুমেন্ট পদ্ধতির শেষ পর্যন্ত বিদ্যমান থাকে।
  • ক্লাস/অবজেক্ট ভেরিয়েবল ধারণ করা বস্তুর জীবনকালের জন্য বিদ্যমান। তাদের দৃশ্যমানতা বিশেষ অ্যাক্সেস মডিফায়ার দ্বারা নিয়ন্ত্রিত হয়।
  • স্ট্যাটিক ক্লাস ভেরিয়েবল সব সময় প্রোগ্রাম চলমান বিদ্যমান. তাদের দৃশ্যমানতা অ্যাক্সেস মডিফায়ার দ্বারাও নির্ধারিত হয়।

মেথড লেভেল স্কোপ

আর্গুমেন্ট সহ একটি পদ্ধতিতে ঘোষিত যেকোন ভেরিয়েবল সেই পদ্ধতির বাইরে অ্যাক্সেসযোগ্য নয়। পদ্ধতির ভিতরে ঘোষিত সমস্ত ভেরিয়েবল তাদের ঘোষণার শুরু থেকে পদ্ধতির শেষ পর্যন্ত দৃশ্যমান। এখানে পদ্ধতি পরিবর্তনশীল সুযোগের একটি উদাহরণ:

public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
এখানে আমাদের আছে secondArg , একটি স্থানীয় পরিবর্তনশীল বা মেথড আর্গুমেন্ট। আমরা এই ভেরিয়েবলটিকে myMethod পদ্ধতির বাইরে বা এটি ঘোষণা করার আগে ব্যবহার করতে পারি না । যদি একটি ভেরিয়েবল একটি ফাংশন আর্গুমেন্ট হয়, তাহলে এটি এই পদ্ধতির সমগ্র অংশে দৃশ্যমান। উপরের উদাহরণে আমরা এই ধরনের দুটি আর্গুমেন্ট পেয়েছি: myMethod-এ arg এবং প্রধান পদ্ধতিতে args।

ক্লাস লেভেল স্কোপ

ক্লাস-লেভেল স্কোপ (ইনস্ট্যান্স ভেরিয়েবল) - একটি ক্লাসে ঘোষিত যে কোনও ভেরিয়েবল সেই ক্লাসের সমস্ত পদ্ধতির জন্য উপলব্ধ। এটির অ্যাক্সেস মডিফায়ার (যেমন সর্বজনীন বা ব্যক্তিগত) উপর নির্ভর করে, এটি কখনও কখনও ক্লাসের বাইরে অ্যাক্সেস করা যেতে পারে। সুতরাং যদি একটি ভেরিয়েবল একটি শ্রেণী পরিবর্তনশীল হয়, তাহলে এটি একটি নির্দিষ্ট বস্তুর সাথে আবদ্ধ এবং যতক্ষণ না এই শ্রেণীর একটি বস্তু আছে ততক্ষণ পর্যন্ত বিদ্যমান থাকে। যদি কোন বস্তু না থাকে, তাহলে চলকের কোন অনুলিপি নেই। ভেরিয়েবলটি ক্লাসের সমস্ত পদ্ধতি থেকে দৃশ্যমান, সেগুলি আগে বা পরে ঘোষণা করা হোক না কেন। প্রতিটি বস্তুর নিজস্ব পরিবর্তনশীল অন্য বস্তু থেকে স্বাধীন। স্ট্যাটিক পদ্ধতি থেকে একটি পরিবর্তনশীল অ্যাক্সেস সম্ভব নয়।

কোড উদাহরণ


public class Student {
   
//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
উপাধি , নাম , দ্বিতীয় নাম এবং জন্মদিন হল ইনস্ট্যান্স ভেরিয়েবল।

ব্লক স্কোপ

যদি একটি ভেরিয়েবল কোডের কিছু ব্লকে সংজ্ঞায়িত/ঘোষিত হয়, তাহলে কোডের সেই ব্লকের শেষ পর্যন্ত এটি বিদ্যমান থাকে। সাধারণত, এই ধরনের ভেরিয়েবলগুলি কোঁকড়া ধনুর্বন্ধনীগুলির মধ্যে বিদ্যমান যেখানে তারা সংজ্ঞায়িত করা হয়েছে। খুব প্রায়ই ব্লক সুযোগ একটি লুপ পরিবর্তনশীল হতে পারে. একটি ভেরিয়েবল যা লুপ অবস্থায় ঘোষণা করা হয় তা লুপের বাইরে অ্যাক্সেসযোগ্য নয়, যদি না আপনি এটি আগে থেকে সংজ্ঞায়িত করেন।

public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }
      
       int sum = 1;
       System.out.println(sum);
   }
}
প্রথম যোগফল এবং i ভেরিয়েবল উভয়ই লুপের ভিতরে ঘোষণা করা হয় এবং এই লুপের বাইরে বিদ্যমান নেই। তবে দ্বিতীয় যোগফল লুপের বাইরে ঘোষণা করা হয়েছিল তাই এই বিশেষ পরিবর্তনশীলটি প্রিন্ট করা হবে।

স্ট্যাটিক ভেরিয়েবল

যদি একটি ভেরিয়েবলকে স্ট্যাটিক হিসাবে ঘোষণা করা হয় (স্ট্যাটিক কীওয়ার্ড দিয়ে চিহ্নিত), তাহলে এটি ততক্ষণ বিদ্যমান থাকে যতক্ষণ পর্যন্ত এর শ্রেণী বিদ্যমান থাকে। সাধারণত, JVM প্রথম ব্যবহারে মেমরিতে একটি ক্লাস লোড করে, যখন স্ট্যাটিক ভেরিয়েবল শুরু হয়।

import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

 
   public static void main(String[] args) {
       System.out.println(today);
   }

}
স্ট্যাটিক টুডে ভেরিয়েবল ব্যবহার করার জন্য আপনার স্টুডেন্ট ক্লাসের একটি নতুন উদাহরণ তৈরি করা উচিত নয় । এখানে "2022" প্রিন্ট করা হবে।

অ্যাক্সেস মডিফায়ার

পদ্ধতি বা পরিবর্তনশীল অ্যাক্সেস সীমাবদ্ধ করতে জাভা 4টি অ্যাক্সেস মডিফায়ার রয়েছে। আপনি এগুলি ক্লাসের ভিতরে ব্যবহার করতে পারেন, পদ্ধতির ভিতরে নয়।
  • ব্যক্তিগত হল সবচেয়ে সীমাবদ্ধ সংশোধক। এটি তাদের ঘোষিত ক্লাসের পদ্ধতি এবং ভেরিয়েবলগুলিতে অ্যাক্সেস সীমাবদ্ধ করে। যদি ক্লাসের বাইরে নির্দিষ্ট পদ্ধতি বা ভেরিয়েবল ব্যবহার করার প্রয়োজন না হয় তবে ব্যক্তিগত ব্যবহার করুন। ক্লাস ভেরিয়েবল সাধারণত জাভাতে ব্যক্তিগত হয়।

  • যদি কোনো অ্যাক্সেস মডিফায়ার নির্দিষ্ট করা না থাকে, পদ্ধতি বা ভেরিয়েবল ডিফল্ট সংশোধক গ্রহণ করবে। ডিফল্ট শুধুমাত্র বর্তমান প্যাকেজ থেকে অ্যাক্সেসের অনুমতি দেয়।

  • সুরক্ষিত মডিফায়ার শুধুমাত্র বর্তমান প্যাকেজের মধ্যে থেকে একটি পদ্ধতি বা ভেরিয়েবলে অ্যাক্সেসের অনুমতি দেয়, যদি না এটি প্যাকেজের বাইরে একটি চাইল্ড ক্লাসের মাধ্যমে অ্যাক্সেস করা হয়।

  • সর্বনিম্ন সীমাবদ্ধ সংশোধক। এটি আপনাকে একটি ক্লাস, মেথড বা ভেরিয়েবল শুধুমাত্র যে ক্লাস থেকে ঘোষণা করা হয়েছে তা নয়, বাইরে থেকেও অ্যাক্সেস করতে দেয়। এই সংশোধক সত্যিই প্রায়ই ব্যবহার করা হয়.

মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION