CodeGym /Java Blog /এলোমেলো /জাভাতে স্ট্যাটিক মডিফায়ার সম্পর্কে 10টি জিনিস আপনার জানা...
John Squirrels
লেভেল 41
San Francisco

জাভাতে স্ট্যাটিক মডিফায়ার সম্পর্কে 10টি জিনিস আপনার জানা দরকার

এলোমেলো দলে প্রকাশিত
জাভাতে, স্ট্যাটিক মডিফায়ার বলতে বোঝায় কোনো কিছু সরাসরি ক্লাসের সাথে সম্পর্কিত: যদি কোনো ফিল্ড স্ট্যাটিক হয়, তাহলে সেটা ক্লাসের অন্তর্গত; যদি একটি পদ্ধতি স্ট্যাটিক হয়, তাহলে এটি ক্লাসের অন্তর্গত। ফলস্বরূপ, আপনি একটি স্ট্যাটিক পদ্ধতি কল করতে বা একটি স্ট্যাটিক ক্ষেত্র উল্লেখ করতে ক্লাসের নাম ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি countক্ষেত্রটি ক্লাসে স্থির থাকে Counter, তাহলে এর অর্থ হল আপনি নিম্নলিখিত অভিব্যক্তির সাথে ভেরিয়েবলটি উল্লেখ করতে পারেন: Counter.count. জাভাতে স্ট্যাটিক মডিফায়ার সম্পর্কে 10টি জিনিস আপনার জানা দরকার - 1অবশ্যই, অ্যাক্সেস মডিফায়ার বিবেচনা করা আবশ্যক। উদাহরণস্বরূপ, privateক্ষেত্রগুলি কেবলমাত্র সেই শ্রেণির মধ্যে উপলব্ধ যা তারা ঘোষণা করা হয়েছে। এবং protectedক্ষেত্রগুলি একটি প্যাকেজের মধ্যে সমস্ত ক্লাসের পাশাপাশি প্যাকেজের বাইরে তাদের সমস্ত সাবক্লাসের জন্য উপলব্ধ। ধরুন Counterক্লাসের একটি স্ট্যাটিক increment()পদ্ধতি আছে যার কাজ হল ইনক্রিমেন্ট করাcountক্ষেত্র এই পদ্ধতি কল, আপনি ব্যবহার করতে পারেন Counter.increment(). Counterএকটি স্ট্যাটিক ক্ষেত্র বা পদ্ধতি অ্যাক্সেস করার জন্য ক্লাসের একটি উদাহরণ তৈরি করার প্রয়োজন নেই । এটি স্ট্যাটিক (শ্রেণী) ভেরিয়েবল এবং পদ্ধতি এবং নন-স্ট্যাটিক (উদাহরণ) ভেরিয়েবল এবং পদ্ধতির মধ্যে মৌলিক পার্থক্য। একটি গুরুত্বপূর্ণ নোট। ভুলে যাবেন না যে ক্লাসের স্ট্যাটিক সদস্যরা সরাসরি ক্লাসের অন্তর্গত, ক্লাসের কোনো উদাহরণ নয়। অর্থাৎ স্ট্যাটিক ভেরিয়েবলের মান সব অবজেক্টের countজন্য একই হবে । Counterএই নিবন্ধে, আমরা জাভাতে স্ট্যাটিক মডিফায়ার ব্যবহার করার মৌলিক দিকগুলি দেখব, সেইসাথে কিছু বৈশিষ্ট্য যা আপনাকে মূল প্রোগ্রামিং ধারণাগুলি বুঝতে সাহায্য করবে।

জাভাতে স্ট্যাটিক মডিফায়ার সম্পর্কে প্রতিটি প্রোগ্রামারের কী জানা উচিত।

এই বিভাগে, আমরা স্ট্যাটিক পদ্ধতি, ক্ষেত্র এবং ক্লাস ব্যবহার করার প্রধান দিকগুলি দেখি। চলুন শুরু করা যাক ভেরিয়েবল দিয়ে।
  1. আপনি স্ট্যাটিক প্রেক্ষাপটের মধ্যে একটি ক্লাসের অ-স্ট্যাটিক সদস্যদের অ্যাক্সেস করতে পারবেন না, যেমন একটি স্ট্যাটিক পদ্ধতি বা ব্লক। নীচের কোডটি কম্পাইল করার ফলে একটি ত্রুটি দেখা দেবে:

    
    public class Counter {
    private int count;
    public static void main(String args []) {
       System.out.println(count); //  Compile time error
    }
    }
    

    এটি জাভা প্রোগ্রামারদের দ্বারা করা সবচেয়ে সাধারণ ভুলগুলির মধ্যে একটি, বিশেষ করে নতুনরা। যেহেতু mainপদ্ধতিটি স্ট্যাটিক এবং countভেরিয়েবলটি নয়, পদ্ধতির printlnভিতরে পদ্ধতিটি ব্যবহার করা mainএকটি "কম্পাইল টাইম ত্রুটি" তৈরি করবে।

  2. thread safeস্থানীয় ভেরিয়েবলের বিপরীতে, স্ট্যাটিক ক্ষেত্র এবং পদ্ধতি জাভাতে নেই । অনুশীলনে, এটি মাল্টি-থ্রেডেড প্রোগ্রামিং-এ নিরাপত্তা সমস্যার সবচেয়ে ঘন ঘন একটি কারণ। বিবেচনা করে যে একটি ক্লাসের প্রতিটি উদাহরণ একটি স্ট্যাটিক ভেরিয়েবলের একই অনুলিপি উল্লেখ করে, এই ধরনের একটি ভেরিয়েবলকে ক্লাস দ্বারা সুরক্ষিত বা "লক" করতে হবে। synchronizedঅতএব, স্ট্যাটিক ভেরিয়েবল ব্যবহার করার সময়, সমস্যাগুলি এড়াতে সেগুলি সঠিকভাবে আছে কিনা তা নিশ্চিত করুন race conditions

  3. স্ট্যাটিক পদ্ধতিগুলির একটি ব্যবহারিক সুবিধা রয়েছে যে প্রতিবার যখন আপনি তাদের কল করতে চান তখন একটি নতুন বস্তু তৈরি করার প্রয়োজন নেই। একটি স্থির পদ্ধতিকে ক্লাসের নাম ব্যবহার করে বলা যেতে পারে যা এটি ঘোষণা করে। factoryএই কারণেই এই পদ্ধতিগুলি পদ্ধতি এবং utilityপদ্ধতির জন্য উপযুক্ত । ক্লাসটি java.lang.Mathএকটি চমৎকার উদাহরণ: এর প্রায় সব পদ্ধতিই স্থির। জাভা এর ইউটিলিটি ক্লাস finalএকই কারণে চিহ্নিত করা হয়।

  4. @Overrideআরেকটি গুরুত্বপূর্ণ বিষয় হল যে আপনি ( ) স্ট্যাটিক পদ্ধতিগুলিকে ওভাররাইড করতে পারবেন না । আপনি যদি একটি , অর্থাৎ একই নাম এবং স্বাক্ষর সহ একটি পদ্ধতিতে এই জাতীয় পদ্ধতি ঘোষণা করেন , আপনি এটিকে ওভাররাইড করার পরিবর্তে subclassশুধুমাত্র "লুকান" এর পদ্ধতিটিকে। superclassএই ঘটনাটি হিসাবে পরিচিত method hiding। এর মানে হল যে যদি একটি স্ট্যাটিক পদ্ধতি পিতামাতা এবং শিশু উভয় শ্রেণিতে ঘোষণা করা হয়, তবে বলা পদ্ধতিটি সর্বদা কম্পাইলের সময় পরিবর্তনশীল প্রকারের উপর ভিত্তি করে হবে। পদ্ধতি ওভাররাইডিংয়ের বিপরীতে, প্রোগ্রাম চালানোর সময় এই জাতীয় পদ্ধতিগুলি কার্যকর করা হবে না। আসুন একটি উদাহরণ বিবেচনা করা যাক:

    
    class Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the parent class / static method");
         } 
    }
    
    class Car extends Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the child class / static method");
         } 
    }
    
    public class Demo {   
       public static void main(String args []) {
          Vehicle v = new Car();
           v.kmToMiles(10);
      }
    }
    

    কনসোল আউটপুট:

    প্যারেন্ট ক্লাস / স্ট্যাটিক পদ্ধতির ভিতরে

    কোডটি স্পষ্টভাবে দেখায় যে বস্তুটি একটি হওয়া সত্ত্বেও Car, ক্লাসে স্ট্যাটিক পদ্ধতি Vehicleবলা হয়, যেহেতু পদ্ধতিটি কম্পাইলের সময় বলা হয়েছিল। এবং নোট করুন যে কোন সংকলন ত্রুটি ছিল!

  5. আরও কী, শীর্ষ-স্তরের ক্লাস ব্যতীত, আপনি ক্লাসগুলিকে স্ট্যাটিক ঘোষণা করতে পারেন। এই ধরনের ক্লাস হিসাবে পরিচিত হয় nested static classes. তারা ভাল সংহতি প্রদানের জন্য দরকারী. একটি নেস্টেড স্ট্যাটিক ক্লাসের একটি আকর্ষণীয় উদাহরণ হল HashMap.Entry, যা ভিতরে একটি ডেটা স্ট্রাকচার HashMap। এটি লক্ষণীয় যে, অভ্যন্তরীণ ক্লাসের মতো, স্ট্যাটিক নেস্টেড ক্লাসগুলি একটি পৃথক .class ফাইলে ঘোষণা করা হয়। এইভাবে, আপনি যদি আপনার প্রধান ক্লাসে পাঁচটি নেস্টেড ক্লাস ঘোষণা করেন, আপনার কাছে .class এক্সটেনশন সহ 6 টি ফাইল থাকবে। আরেকটি উদাহরণ হল আমাদের নিজস্ব ঘোষণা Comparator, যেমন ক্লাসে বয়সের তুলনাকারী ( AgeComparator) Employee

  6. স্ট্যাটিক মডিফায়ারকে একটি স্ট্যাটিক ব্লকেও নির্দিষ্ট করা যেতে পারে, যা "স্ট্যাটিক ইনিশিয়ালাইজেশন ব্লক" নামে বেশি পরিচিত, যা ক্লাস লোড হওয়ার সময় কার্যকর করা হয়। আপনি যদি এই ধরনের একটি ব্লক ঘোষণা না করেন, জাভা একটি একক তালিকায় সমস্ত স্ট্যাটিক ক্ষেত্র সংগ্রহ করে এবং ক্লাস লোড হলে সেগুলি শুরু করে। একটি স্ট্যাটিক ব্লক চেক করা ব্যতিক্রমগুলি ফেলতে পারে না, তবে এটি চেক না করাগুলিকে ফেলতে পারে। এই ক্ষেত্রে, একটি ExceptionInInitializerErrorঘটবে. অনুশীলনে, স্ট্যাটিক ক্ষেত্রগুলির আরম্ভ করার সময় যে কোনও ব্যতিক্রম ঘটলে জাভা এই ত্রুটির সাথে মোড়ানো হবে। এটিও এর সবচেয়ে সাধারণ কারণ NoClassDefFoundError, কারণ রেফারেন্স করার সময় ক্লাসটি মেমরিতে থাকবে না।

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

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

  9. সিরিয়ালাইজেশনের সময়, ভেরিয়েবলের মতো স্ট্যাটিক ক্ষেত্রগুলি transientসিরিয়াল করা হয় না। প্রকৃতপক্ষে, যদি আপনি একটি স্ট্যাটিক ক্ষেত্রে কোনো ডেটা সংরক্ষণ করেন, তাহলে ডিসিরিয়ালাইজেশনের পরে এটির প্রাথমিক (ডিফল্ট) মান থাকবে। উদাহরণস্বরূপ, যদি একটি স্ট্যাটিক ক্ষেত্র একটি হয় int, তাহলে ডিসিরিয়ালাইজেশনের পরে এর মান শূন্য হবে। যদি এর ধরন হয় float, তাহলে মান হবে 0.0। ক্ষেত্রটি একটি হলে Object, মানটি হবে null। সত্যি কথা বলতে, এটি জাভা পদের জন্য সাক্ষাত্কারে সিরিয়ালাইজেশন সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্নগুলির মধ্যে একটি। একটি স্ট্যাটিক ক্ষেত্রে অপরিহার্য বস্তু তথ্য সংরক্ষণ করবেন না!

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

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

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