টীকাগুলির প্রধান সুবিধাটি ইতিমধ্যে JDK-তে থাকা স্ট্যান্ডার্ডগুলি ব্যবহার করে আসে না। একই সময়ে, খুব কমই আপনার নিজস্ব টীকা তৈরি করার প্রয়োজন আছে। কিন্তু যদি আমরা একটি বৃহৎ ব্যবস্থা গড়ে তুলি বা একটি পৃথক লাইব্রেরি তৈরি করি, তাহলে স্থাপত্য স্তরে, আমাদের নিজস্ব টীকা প্রয়োগ করলে অবশ্যই লভ্যাংশ পাওয়া যাবে।

আসুন একটি টীকা তৈরি করার চেষ্টা করি।

এটি করার জন্য, একটি ফাইল তৈরি করুন, কিন্তু ক্লাস বা ইন্টারফেস লেখার পরিবর্তে , @interface লিখুন । এটি আমাদের টীকা জন্য ফাইল হবে. একটি টীকাটির অভ্যন্তরীণ কাঠামো একটি ইন্টারফেসের মতো।


public @interface Sum {
   int sum() default 0;
}

@ইন্টারফেস নির্দেশ করে যে এটি একটি টীকা,
ডিফল্ট বলে যে প্যারামিটারের একটি নির্দিষ্ট ডিফল্ট মান থাকবে।

তা-দা! আমরা একটি টীকা তৈরি করেছি! তাত্ত্বিকভাবে আমরা এটি ইতিমধ্যেই ব্যবহার করতে পারি, তবে প্রথমে এটি কনফিগার করা ভাল হবে।

কনফিগারেশন ব্যতীত, আমাদের টীকা যেকোন কিছুতে (শ্রেণী, পদ্ধতি, বৈশিষ্ট্য ইত্যাদি) প্রয়োগ করা যেতে পারে, তাই এই মুহুর্তে এটি ব্যবহার করা সামান্যই বোঝায়। এটা অদ্ভুত মনে হতে পারে, আমাদের টীকা অন্যান্য টীকা সঙ্গে টীকা করা প্রয়োজন!

@ টার্গেট দিয়ে শুরু করা যাক ।

@ টার্গেট টীকা (জাভা 1.5 থেকে প্রাসঙ্গিক) একটি টীকা প্রয়োগ করার ক্ষমতাকে সীমাবদ্ধ করে। একটি নির্দিষ্ট স্তরে ব্যবহার সীমিত করার জন্য, আমাদের @Target টীকাটিতে একটি আর্গুমেন্ট পাস করতে হবে যাতে এটি কোন ধরনের প্রয়োগ করা যেতে পারে তা নির্দেশ করতে হবে। এখানে কিছু সাধারণভাবে ব্যবহৃত প্রকার রয়েছে:

@টার্গেট(ElementType.PACKAGE) প্যাকেজের জন্য
@টার্গেট(ElementType.TYPE) ক্লাসের জন্য
@টার্গেট(ElementType.CONSTRUCTOR) কনস্ট্রাক্টরদের জন্য
@টার্গেট(ElementType.METHOD) পদ্ধতির জন্য
@টার্গেট(ElementType.FIELD) একটি ক্লাসে বৈশিষ্ট্যগুলির (ভেরিয়েবল) জন্য
@টার্গেট(ElementType.PARAMATER) পদ্ধতি পরামিতি জন্য
@টার্গেট(ElementType.LOCAL_VARIABLE) স্থানীয় ভেরিয়েবলের জন্য

আপনি যদি বিভিন্ন ধরণের জন্য একটি টীকা প্রয়োজন, তাহলে আপনি একটি অ্যারে হিসাবে বেশ কয়েকটি আর্গুমেন্ট পাস করতে পারেন:


@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

কনফিগারেশনের পরবর্তী গুরুত্বপূর্ণ অংশ হল @ রিটেনশন টীকা।

এই টীকাটি কোডের জীবনচক্রের অংশগুলি নির্দেশ করে যেখানে আমাদের টীকা পাওয়া যাবে:

RetentionPolicy.SOURCE SOURCE ধারণ নীতির সাথে চিহ্নিত টীকাগুলি চালানোর সময় বাতিল করা হয়৷
রিটেনশন পলিসি।ক্লাস CLASS ধরে রাখার নীতির সাথে চিহ্নিত টীকাগুলি .class ফাইলে লেখা হয় , কিন্তু রান টাইমে সরানো হয়।
রিটেনশন পলিসি।RUNTIME RUNTIME ধরে রাখার নীতির সাথে চিহ্নিত টীকাগুলি রান টাইমে টিকে থাকে এবং রান টাইমে আমাদের প্রোগ্রামে অ্যাক্সেস করা যেতে পারে।

কনফিগারেশনের জন্য আপনি ব্যবহার করতে পারেন এমন আরও কয়েকটি টীকা রয়েছে:

টীকা মান
@উত্তরাধিকারসূত্রে প্রাপ্ত নির্দেশ করে যে একটি প্রাপ্ত বর্গ একটি অভিভাবক শ্রেণীর দ্বারা টীকাটির বাস্তবায়নের উত্তরাধিকারী হয়৷
@ নথিভুক্ত এটি নির্দেশ করে যে টীকাটি জেনারেট করা Javadoc ডকুমেন্টেশনে অন্তর্ভুক্ত করা হবে।

এখন আমাদের নিজস্ব টীকা তৈরি করার চেষ্টা করা যাক.

আমরা একটি টীকা তৈরি করব যা ক্লাস এবং পদ্ধতির জন্য এবং এতে কোডের লেখক এবং সংস্করণ সম্পর্কে তথ্য থাকবে:


    @Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

আমরা পদ্ধতি এবং ক্লাসে আমাদের টীকা প্রয়োগ করতে পারি। আমাদের টীকা এর মেটাডেটা রান টাইমে উপলব্ধ হবে. আমাদের টীকাটির পরামিতিগুলিতে মনোযোগ দিন: আমরা দুটি আর্গুমেন্ট (লেখক এবং সংস্করণ) সরবরাহ করতে পারি, অথবা আমরা সেগুলি বাদ দিতে পারি। যদি আমরা সেগুলি বাদ দিই, তাহলে নির্দিষ্ট ডিফল্ট মান ( ডিফল্ট "লেখক" এবং ডিফল্ট "0.0" ) ব্যবহার করা হবে।

এটি লক্ষণীয় যে আমাদের প্যারামিটারের জন্য একটি ডিফল্ট মান নির্দিষ্ট করতে হবে না। এই ক্ষেত্রে, প্যারামিটার বাধ্যতামূলক হয়ে ওঠে।

আর্গুমেন্ট পাস করার সময়, আমাদের অবশ্যই স্বরলিপি মান = "মান" ব্যবহার করে সংশ্লিষ্ট প্যারামিটারটি নির্দিষ্ট করতে হবে । প্যারামিটারটি সর্বদা স্পষ্টভাবে নামকরণ করা আবশ্যক, এমনকি যদি টীকাটির একটি একক প্যারামিটার থাকে।

আসুন কয়েকটি ক্লাসে আমাদের টীকা প্রয়োগ করি:


@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}
 
@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}
 
@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}