count
ক্ষেত্রটি ক্লাসে স্থির থাকে Counter
, তাহলে এর অর্থ হল আপনি নিম্নলিখিত অভিব্যক্তির সাথে ভেরিয়েবলটি উল্লেখ করতে পারেন: Counter.count
. অবশ্যই, অ্যাক্সেস মডিফায়ার বিবেচনা করা আবশ্যক। উদাহরণস্বরূপ, private
ক্ষেত্রগুলি কেবলমাত্র সেই শ্রেণির মধ্যে উপলব্ধ যা তারা ঘোষণা করা হয়েছে। এবং protected
ক্ষেত্রগুলি একটি প্যাকেজের মধ্যে সমস্ত ক্লাসের পাশাপাশি প্যাকেজের বাইরে তাদের সমস্ত সাবক্লাসের জন্য উপলব্ধ। ধরুন Counter
ক্লাসের একটি স্ট্যাটিক increment()
পদ্ধতি আছে যার কাজ হল ইনক্রিমেন্ট করাcount
ক্ষেত্র এই পদ্ধতি কল, আপনি ব্যবহার করতে পারেন Counter.increment()
. Counter
একটি স্ট্যাটিক ক্ষেত্র বা পদ্ধতি অ্যাক্সেস করার জন্য ক্লাসের একটি উদাহরণ তৈরি করার প্রয়োজন নেই । এটি স্ট্যাটিক (শ্রেণী) ভেরিয়েবল এবং পদ্ধতি এবং নন-স্ট্যাটিক (উদাহরণ) ভেরিয়েবল এবং পদ্ধতির মধ্যে মৌলিক পার্থক্য। একটি গুরুত্বপূর্ণ নোট। ভুলে যাবেন না যে ক্লাসের স্ট্যাটিক সদস্যরা সরাসরি ক্লাসের অন্তর্গত, ক্লাসের কোনো উদাহরণ নয়। অর্থাৎ স্ট্যাটিক ভেরিয়েবলের মান সব অবজেক্টের count
জন্য একই হবে । Counter
এই নিবন্ধে, আমরা জাভাতে স্ট্যাটিক মডিফায়ার ব্যবহার করার মৌলিক দিকগুলি দেখব, সেইসাথে কিছু বৈশিষ্ট্য যা আপনাকে মূল প্রোগ্রামিং ধারণাগুলি বুঝতে সাহায্য করবে।
জাভাতে স্ট্যাটিক মডিফায়ার সম্পর্কে প্রতিটি প্রোগ্রামারের কী জানা উচিত।
এই বিভাগে, আমরা স্ট্যাটিক পদ্ধতি, ক্ষেত্র এবং ক্লাস ব্যবহার করার প্রধান দিকগুলি দেখি। চলুন শুরু করা যাক ভেরিয়েবল দিয়ে।-
আপনি স্ট্যাটিক প্রেক্ষাপটের মধ্যে একটি ক্লাসের অ-স্ট্যাটিক সদস্যদের অ্যাক্সেস করতে পারবেন না, যেমন একটি স্ট্যাটিক পদ্ধতি বা ব্লক। নীচের কোডটি কম্পাইল করার ফলে একটি ত্রুটি দেখা দেবে:
public class Counter { private int count; public static void main(String args []) { System.out.println(count); // Compile time error } }
এটি জাভা প্রোগ্রামারদের দ্বারা করা সবচেয়ে সাধারণ ভুলগুলির মধ্যে একটি, বিশেষ করে নতুনরা। যেহেতু
main
পদ্ধতিটি স্ট্যাটিক এবংcount
ভেরিয়েবলটি নয়, পদ্ধতিরprintln
ভিতরে পদ্ধতিটি ব্যবহার করাmain
একটি "কম্পাইল টাইম ত্রুটি" তৈরি করবে। -
thread safe
স্থানীয় ভেরিয়েবলের বিপরীতে, স্ট্যাটিক ক্ষেত্র এবং পদ্ধতি জাভাতে নেই । অনুশীলনে, এটি মাল্টি-থ্রেডেড প্রোগ্রামিং-এ নিরাপত্তা সমস্যার সবচেয়ে ঘন ঘন একটি কারণ। বিবেচনা করে যে একটি ক্লাসের প্রতিটি উদাহরণ একটি স্ট্যাটিক ভেরিয়েবলের একই অনুলিপি উল্লেখ করে, এই ধরনের একটি ভেরিয়েবলকে ক্লাস দ্বারা সুরক্ষিত বা "লক" করতে হবে।synchronized
অতএব, স্ট্যাটিক ভেরিয়েবল ব্যবহার করার সময়, সমস্যাগুলি এড়াতে সেগুলি সঠিকভাবে আছে কিনা তা নিশ্চিত করুনrace conditions
। -
স্ট্যাটিক পদ্ধতিগুলির একটি ব্যবহারিক সুবিধা রয়েছে যে প্রতিবার যখন আপনি তাদের কল করতে চান তখন একটি নতুন বস্তু তৈরি করার প্রয়োজন নেই। একটি স্থির পদ্ধতিকে ক্লাসের নাম ব্যবহার করে বলা যেতে পারে যা এটি ঘোষণা করে।
factory
এই কারণেই এই পদ্ধতিগুলি পদ্ধতি এবংutility
পদ্ধতির জন্য উপযুক্ত । ক্লাসটিjava.lang.Math
একটি চমৎকার উদাহরণ: এর প্রায় সব পদ্ধতিই স্থির। জাভা এর ইউটিলিটি ক্লাসfinal
একই কারণে চিহ্নিত করা হয়। -
@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
বলা হয়, যেহেতু পদ্ধতিটি কম্পাইলের সময় বলা হয়েছিল। এবং নোট করুন যে কোন সংকলন ত্রুটি ছিল! -
আরও কী, শীর্ষ-স্তরের ক্লাস ব্যতীত, আপনি ক্লাসগুলিকে স্ট্যাটিক ঘোষণা করতে পারেন। এই ধরনের ক্লাস হিসাবে পরিচিত হয়
nested static classes
. তারা ভাল সংহতি প্রদানের জন্য দরকারী. একটি নেস্টেড স্ট্যাটিক ক্লাসের একটি আকর্ষণীয় উদাহরণ হলHashMap.Entry
, যা ভিতরে একটি ডেটা স্ট্রাকচারHashMap
। এটি লক্ষণীয় যে, অভ্যন্তরীণ ক্লাসের মতো, স্ট্যাটিক নেস্টেড ক্লাসগুলি একটি পৃথক .class ফাইলে ঘোষণা করা হয়। এইভাবে, আপনি যদি আপনার প্রধান ক্লাসে পাঁচটি নেস্টেড ক্লাস ঘোষণা করেন, আপনার কাছে .class এক্সটেনশন সহ 6 টি ফাইল থাকবে। আরেকটি উদাহরণ হল আমাদের নিজস্ব ঘোষণাComparator
, যেমন ক্লাসে বয়সের তুলনাকারী (AgeComparator
)Employee
। -
স্ট্যাটিক মডিফায়ারকে একটি স্ট্যাটিক ব্লকেও নির্দিষ্ট করা যেতে পারে, যা "স্ট্যাটিক ইনিশিয়ালাইজেশন ব্লক" নামে বেশি পরিচিত, যা ক্লাস লোড হওয়ার সময় কার্যকর করা হয়। আপনি যদি এই ধরনের একটি ব্লক ঘোষণা না করেন, জাভা একটি একক তালিকায় সমস্ত স্ট্যাটিক ক্ষেত্র সংগ্রহ করে এবং ক্লাস লোড হলে সেগুলি শুরু করে। একটি স্ট্যাটিক ব্লক চেক করা ব্যতিক্রমগুলি ফেলতে পারে না, তবে এটি চেক না করাগুলিকে ফেলতে পারে। এই ক্ষেত্রে, একটি
ExceptionInInitializerError
ঘটবে. অনুশীলনে, স্ট্যাটিক ক্ষেত্রগুলির আরম্ভ করার সময় যে কোনও ব্যতিক্রম ঘটলে জাভা এই ত্রুটির সাথে মোড়ানো হবে। এটিও এর সবচেয়ে সাধারণ কারণNoClassDefFoundError
, কারণ রেফারেন্স করার সময় ক্লাসটি মেমরিতে থাকবে না। -
এটা জানা দরকারী যে স্ট্যাটিক পদ্ধতিগুলি কম্পাইলের সময়ে লিঙ্ক করা হয়, ভার্চুয়াল বা নন-স্ট্যাটিক পদ্ধতিগুলির লিঙ্কিংয়ের বিপরীতে, যেগুলি বাস্তব বস্তুতে কল করার সময় রান টাইমে লিঙ্ক করা হয়। তদনুসারে, জাভাতে স্ট্যাটিক পদ্ধতিগুলিকে ওভাররাইড করা যাবে না, যেহেতু পলিমারফিজম রান টাইমে তাদের ক্ষেত্রে প্রযোজ্য নয়। একটি পদ্ধতি স্ট্যাটিক ঘোষণা করার সময় এটি বিবেচনা করা একটি গুরুত্বপূর্ণ সীমাবদ্ধতা। সাবক্লাসে পদ্ধতিটিকে ওভাররাইড করার কোন ক্ষমতা বা প্রয়োজন না থাকলেই তা করা অর্থপূর্ণ। ফ্যাক্টরি পদ্ধতি এবং ইউটিলিটি পদ্ধতিগুলি স্ট্যাটিক মডিফায়ারের সঠিক ব্যবহারের ভাল উদাহরণ। জোশুয়া ব্লচ তার ইফেক্টিভ জাভা বইতে স্ট্যাটিক ফ্যাক্টরি মেথডের অনেকগুলো সুবিধার কথা উল্লেখ করেছেন, যা প্রত্যেক জাভা প্রোগ্রামারের জন্য বাধ্যতামূলক পড়া।
-
ইনিশিয়ালাইজেশন একটি স্ট্যাটিক ব্লকের একটি গুরুত্বপূর্ণ দিক। ক্লাস মেমরিতে লোড হওয়ার পরে স্ট্যাটিক ক্ষেত্র বা ভেরিয়েবলগুলি শুরু করা হয়। ইনিশিয়ালাইজেশনের ক্রম উপরের থেকে নীচে, একই ক্রমে জাভা ক্লাসের সোর্স ফাইলে ঘোষণা করা হয়। যেহেতু স্ট্যাটিক ক্ষেত্রগুলি একটি থ্রেড-নিরাপদ পদ্ধতিতে শুরু করা হয়, এই প্রক্রিয়াটি প্যাটার্নটি বাস্তবায়নের জন্যও ব্যবহৃত হয়
Singleton
। আপনি যদি কোনো কারণেEnum
একটি হিসেবে ব্যবহার না করেন, তাহলে আপনার কাছে একটি ভালো বিকল্প আছে।Singleton
কিন্তু এই ক্ষেত্রে, আপনাকে অবশ্যই বিবেচনা করতে হবে যে এটি একটি "অলস" শুরু নয়। এর মানে হল যে কেউ এটির জন্য "জিজ্ঞাসা" করার আগেও স্ট্যাটিক ক্ষেত্রটি শুরু করা হবে। যদি একটি বস্তু সম্পদ-ভারী বা খুব কমই ব্যবহৃত হয়, তাহলে এটি একটি স্ট্যাটিক ব্লকে শুরু করা আপনার পক্ষে কাজ করবে না। -
সিরিয়ালাইজেশনের সময়, ভেরিয়েবলের মতো স্ট্যাটিক ক্ষেত্রগুলি
transient
সিরিয়াল করা হয় না। প্রকৃতপক্ষে, যদি আপনি একটি স্ট্যাটিক ক্ষেত্রে কোনো ডেটা সংরক্ষণ করেন, তাহলে ডিসিরিয়ালাইজেশনের পরে এটির প্রাথমিক (ডিফল্ট) মান থাকবে। উদাহরণস্বরূপ, যদি একটি স্ট্যাটিক ক্ষেত্র একটি হয়int
, তাহলে ডিসিরিয়ালাইজেশনের পরে এর মান শূন্য হবে। যদি এর ধরন হয়float
, তাহলে মান হবে 0.0। ক্ষেত্রটি একটি হলেObject
, মানটি হবেnull
। সত্যি কথা বলতে, এটি জাভা পদের জন্য সাক্ষাত্কারে সিরিয়ালাইজেশন সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্নগুলির মধ্যে একটি। একটি স্ট্যাটিক ক্ষেত্রে অপরিহার্য বস্তু তথ্য সংরক্ষণ করবেন না! -
অবশেষে, স্ট্যাটিক আমদানি সম্পর্কে কথা বলা যাক। স্ট্যান্ডার্ড স্টেটমেন্টের সাথে এই মডিফায়ারটির অনেক মিল রয়েছে
import
, কিন্তু এটি আলাদা যে এটি আপনাকে এক বা সমস্ত স্ট্যাটিক ক্লাস সদস্যদের পোর্ট করতে দেয়। স্ট্যাটিক পদ্ধতিগুলি একবার আমদানি করা হলে, সেগুলিকে অ্যাক্সেস করা যেতে পারে যেন সেগুলি একই শ্রেণিতে ঘোষণা করা হয়েছিল। একইভাবে, স্ট্যাটিক ক্ষেত্র আমদানি করে, আমরা ক্লাসের নাম উল্লেখ না করেই সেগুলি অ্যাক্সেস করতে পারি। এই বৈশিষ্ট্যটি Java 1.5-এ উপস্থিত হয়েছে এবং সঠিকভাবে ব্যবহার করা হলে কোড পাঠযোগ্যতা উন্নত করে। এই গঠনটি প্রায়শই JUnit পরীক্ষায় পাওয়া যায়, যেহেতু প্রায় সমস্ত পরীক্ষার বিকাশকারীরা দাবী পদ্ধতির জন্য স্ট্যাটিক ইম্পোর্ট ব্যবহার করে, যেমনassertEquals()
এবং তাদের ওভারলোড ভেরিয়েন্ট। -
এখন এ পর্যন্তই. প্রতিটি জাভা প্রোগ্রামারকে উপরে উল্লিখিত স্ট্যাটিক মডিফায়ারের সমস্ত দিক জানতে হবে। এই নিবন্ধটি স্ট্যাটিক ভেরিয়েবল, ক্ষেত্র, পদ্ধতি, প্রাথমিককরণ ব্লক এবং আমদানি সম্পর্কে প্রাথমিক তথ্য পর্যালোচনা করেছে। এটি কিছু গুরুত্বপূর্ণ বৈশিষ্ট্যকেও স্পর্শ করেছে যা জাভা প্রোগ্রাম লিখতে এবং বোঝার জন্য জানা অপরিহার্য। আমি আশা করি যে প্রতিটি বিকাশকারী তাদের স্ট্যাটিক সদস্যদের দক্ষতার সাথে ব্যবহারকে নিখুঁত করবে, কারণ এটি গুরুতর সফ্টওয়্যার বিকাশের জন্য অত্যন্ত গুরুত্বপূর্ণ।"
GO TO FULL VERSION