Java Annotations হল একটি বিশেষ ধরনের মেটাডেটা যা ক্লাস, মেথড, ফিল্ড, প্যারামিটার বা প্যাকেজের উপর প্রয়োগ করা যায়। এটি মূলত কোডের মধ্যে অতিরিক্ত তথ্য যোগ করার জন্য ব্যবহৃত হয় এবং এতে সাধারণত কোনো কার্যকরী কোড থাকে না। তবে, অ্যানোটেশনগুলি Reflection API এর মাধ্যমে রানটাইমে প্রক্রিয়া করা যায়, বা কাস্টম প্রক্রিয়া (যেমন কোড জেনারেশন, ডকুমেন্টেশন তৈরি) চালানোর জন্য ব্যবহার করা যেতে পারে।
Java Annotations এর কাজ:
- Metadata প্রদান: অ্যানোটেশনগুলি কোডের বিভিন্ন অংশে অতিরিক্ত তথ্য প্রদান করে, যা পরে প্রসেস করা যেতে পারে।
- Code Generation: অ্যানোটেশন ব্যবহার করে বিভিন্ন লাইব্রেরি বা টুলগুলি কোড জেনারেট করতে পারে। যেমন, Lombok অ্যানোটেশন ব্যবহার করে স্রেফ ক্লাস ডিফাইন করে প্রয়োজনীয় গেটারস, সেটারস ইত্যাদি মেথড জেনারেট করা।
- Compile-time checking: অ্যানোটেশনগুলি কম্পাইলার দ্বারা প্রক্রিয়া করা যেতে পারে যেমন @Override অ্যানোটেশন ব্যবহার করে কোডের ভুল সনাক্ত করা যায়।
- Runtime processing: রানটাইমে অ্যানোটেশনগুলি Reflection API এর মাধ্যমে প্রক্রিয়া করা যেতে পারে এবং প্রয়োগকৃত ক্লাসের উপর কার্যক্রম পরিচালনা করা যায়।
- Documentation: অ্যানোটেশনগুলি ডকুমেন্টেশনের জন্য সহায়তা করে, যেমন @Deprecated অ্যানোটেশনটি কোডে ডিপ্রিকেটেড ফিচার চিহ্নিত করে।
Java Annotations এর প্রকারভেদ:
- Built-in Annotations: Java তে কিছু বিল্ট-ইন অ্যানোটেশন রয়েছে যা অত্যন্ত ব্যবহারিক এবং গুরুত্বপূর্ণ। এই অ্যানোটেশনগুলির মধ্যে কিছু সাধারণ অ্যানোটেশন রয়েছে:
@Override:
- এটি একটি মেথডের উপরে ব্যবহৃত হয় এবং একটি প্যারেন্ট ক্লাসের মেথডকে ওভাররাইড করা হচ্ছে কি না তা নিশ্চিত করে। কম্পাইলার এই অ্যানোটেশনকে সনাক্ত করে যদি মেথডটি ভুলভাবে ডিফাইন করা হয় (যেমন সিগনেচার মেল না খাওয়া), তবে ত্রুটি দেখায়।
class Animal { void sound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override void sound() { System.out.println("Woof"); } }@Deprecated:
- এই অ্যানোটেশনটি ব্যবহার করা হয় সেই মেথড, ক্লাস বা ফিল্ডকে চিহ্নিত করতে যা ভবিষ্যতে ব্যবহারের জন্য পরিত্যক্ত বা ডিপ্রিকেটেড। এটি ভবিষ্যতের আপডেটগুলিতে বিকল্প ব্যবহারের জন্য প্রস্তাবনা দেয়।
@Deprecated public void oldMethod() { System.out.println("This method is deprecated"); }@SuppressWarnings:
- এই অ্যানোটেশনটি কম্পাইলারকে কিছু নির্দিষ্ট সতর্কতা উপেক্ষা করতে বলে। সাধারণত এটি কোডে কোনো ওয়ার্নিং থাকলে তা উপেক্ষা করতে ব্যবহৃত হয়।
@SuppressWarnings("unchecked") public void someMethod() { // Some code that generates a warning }@FunctionalInterface:
- এটি Functional Interface নির্ধারণ করার জন্য ব্যবহৃত হয়। যে ইন্টারফেসে একটি মাত্র抽象 মেথড থাকে, তাকে Functional Interface বলা হয় এবং সেই ইন্টারফেসে lambda expressions ব্যবহার করা যায়।
@FunctionalInterface interface MyFunction { void apply(); }
Custom Annotations (কাস্টম অ্যানোটেশন): আপনি আপনার নিজের কাস্টম অ্যানোটেশনও তৈরি করতে পারেন যা আপনার প্রজেক্টের জন্য উপযুক্ত হয়। কাস্টম অ্যানোটেশনগুলি @interface কিওয়ার্ড ব্যবহার করে ডিফাইন করা হয়।
কাস্টম অ্যানোটেশন ডিফাইন করার উদাহরণ:
@interface MyCustomAnnotation { String value() default "defaultValue"; int number() default 0; } class TestClass { @MyCustomAnnotation(value = "Test", number = 10) public void testMethod() { System.out.println("This is a test method."); } }Retention Policy:
- অ্যানোটেশনগুলির Retention Policy নির্ধারণ করা যায়। এটি বলে দেয় অ্যানোটেশনটি কোন সময়ে উপলব্ধ থাকবে: Compile-time বা Runtime।
- @Retention অ্যানোটেশন ব্যবহার করে আপনি এটি নিয়ন্ত্রণ করতে পারেন।
@Retention(RetentionPolicy.RUNTIME) // This annotation is available at runtime. @interface MyAnnotation { String value(); }
- Marker Annotations:
- Marker Annotations এমন অ্যানোটেশন যা কোনো মেথড বা ক্লাসে তথ্য যোগ না করে, বরং সেটির উপস্থিতি থেকে একটি নির্দিষ্ট আচরণ বোঝায়।
- উদাহরণ: @Override, @Deprecated, @FunctionalInterface এগুলি মাকার অ্যানোটেশন। এগুলির কোনো অতিরিক্ত তথ্য থাকে না, শুধুমাত্র তাদের উপস্থিতি কিছু নির্দেশনা দেয়।
- Single-Value Annotations:
- যদি অ্যানোটেশনটি একটিমাত্র ভ্যালু গ্রহণ করে, তবে আপনি value() মেথডটি সংক্ষেপে ব্যবহার করতে পারেন।
উদাহরণ:
@interface SingleValueAnnotation { String value(); } @SingleValueAnnotation("Hello Annotation") class Example { // code }
Meta-Annotations:
- Meta-annotations হল অ্যানোটেশনগুলির অ্যানোটেশন, যা অন্যান্য অ্যানোটেশনগুলিকে প্রক্রিয়া করতে ব্যবহৃত হয়। সাধারণ Meta-annotations গুলি হল:
- @Retention: এটি নির্ধারণ করে অ্যানোটেশনটি কবে পর্যন্ত অ্যাক্সেসযোগ্য থাকবে (কম্পাইল টাইম বা রানটাইম)।
- @Target: এটি নির্ধারণ করে অ্যানোটেশনটি কোথায় প্রয়োগ করা যাবে (ক্লাস, মেথড, ফিল্ড, প্যারামিটার ইত্যাদি)।
- @Inherited: এটি বলে দেয় যে অ্যানোটেশনটি সাবক্লাসে হেরিট করা যাবে কিনা।
- @Documented: এটি নির্দেশ করে যে অ্যানোটেশনটি JavaDocs-এ ডকুমেন্টেশন হিসাবে অন্তর্ভুক্ত করা হবে।
- @Repeatable: এটি একটি অ্যানোটেশনকে একাধিক বার ব্যবহার করার অনুমতি দেয়।
উদাহরণ:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface CustomAnnotation { String info() default "default info"; }- Meta-annotations হল অ্যানোটেশনগুলির অ্যানোটেশন, যা অন্যান্য অ্যানোটেশনগুলিকে প্রক্রিয়া করতে ব্যবহৃত হয়। সাধারণ Meta-annotations গুলি হল:
Java Annotations কোডে অতিরিক্ত তথ্য যোগ করতে ব্যবহৃত হয় এবং reflection বা compile-time validation এর মাধ্যমে প্রক্রিয়া করা যেতে পারে। এটি বিভিন্ন প্রকারের হতে পারে:
- Built-in annotations (যেমন
@Override,@Deprecated), - Custom annotations (কাস্টম তৈরি অ্যানোটেশন),
- Meta-annotations (যেগুলি অন্যান্য অ্যানোটেশনগুলি কাস্টমাইজ বা প্রক্রিয়া করতে ব্যবহৃত হয়)।
Annotations খুবই কার্যকরী টুল, যা কোডের পাঠযোগ্যতা বৃদ্ধি করে, অটোমেটেড প্রক্রিয়ায় সাহায্য করে এবং কোডের ইন্টিগ্রিটি নিশ্চিত করতে সহায়তা করে।
Read more