2005 সালে, জাভা 5 এর আগমনের সাথে, আমরা টীকা নামক নতুন সত্তার সাথে পরিচিত হয়েছিলাম।

টীকা হল সিনট্যাকটিক মেটাডেটার একটি বিশেষ রূপ যা কোডে ঘোষণা করা যেতে পারে। এগুলি সংকলন বা রানটাইমে কোড বিশ্লেষণ করতে ব্যবহৃত হয়। আপনি একটি লেবেল, ট্যাগ বা কম্পাইলার ইঙ্গিত হিসাবে একটি টীকা মনে করতে পারেন।

আপনি সম্ভবত আগে টীকা জুড়ে আসা হয়েছে. উদাহরণস্বরূপ, প্যারেন্ট ক্লাসের একটি পদ্ধতিকে ওভাররাইড করার সময়, আমরা পদ্ধতির আগে @Override লিখি। এই টীকাটি নির্দেশ করে যে পিতামাতার পদ্ধতি শিশু শ্রেণিতে ওভাররাইড করা হবে।

বাক্য গঠন:


@Override
public int hashCode() {
      return super.hashCode();
}

আমি এখনই নোট করতে চাই যে টীকাগুলি শুধুমাত্র পদ্ধতিতে প্রযোজ্য নয়। এগুলি প্যাকেজ, ক্লাস, পদ্ধতি, ক্ষেত্র এবং পরামিতিগুলির সাথে ব্যবহার করা হয়।

টীকা কীভাবে কাজ করে তা বোঝার জন্য, আসুন প্রথমে একটি মার্কার ইন্টারফেসের ধারণার সাথে পরিচিত হই। জাভা-এর আবির্ভাবের পর থেকে, ডেভেলপারদের সর্বদা ক্লাস চিহ্নিত করার একটি উপায় প্রয়োজন হয় যাতে সেগুলির উপর নির্দিষ্ট কিছু কাজ করা যায়।

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

এই ধরনের একটি ইন্টারফেস একটি মার্কার ইন্টারফেস বলা হয়. নাম থেকে আপনি অনুমান করতে পারেন যে এর উদ্দেশ্য JVM, কম্পাইলার বা কিছু লাইব্রেরির জন্য ক্লাস চিহ্নিত করা। কিছু মার্কার ইন্টারফেস, যেমন সিরিয়ালাইজেবল , রয়ে গেছে। এই মার্কার ইন্টারফেসটি আমাদের নির্দেশ করতে দেয় যে একটি ক্লাসের দৃষ্টান্তগুলি সিরিয়াল করা যেতে পারে।

যেমনটি আমরা দেখেছি, টীকা প্রবর্তনের পরেও মার্কার ইন্টারফেসগুলি চলতে থাকে।

টীকা বনাম মার্কার ইন্টারফেস:


@MyAnnotation
public class MyClass {}

public class MyClass implements MarkerInterface {}

উভয় পদ্ধতির একই উদ্দেশ্য রয়েছে, তবে তাদের বাস্তবায়নে একটি স্পষ্ট পার্থক্য রয়েছে। উদাহরণস্বরূপ, একটি ইন্টারফেস এবং একটি টীকা বিবেচনা করুন যা নির্দেশ করে যে একটি ক্লাস একটি নির্দিষ্ট ধরণের অন্তর্গত।

যদি আমরা একটি ইন্টারফেস ব্যবহার করি, তাহলে আমরা ক্লাসটি চিহ্নিত করি। যদি আমরা এটি ভুলভাবে ব্যবহার করি এবং একটি ত্রুটি ঘটে, তাহলে আমরা সংকলনের সময় সমস্যাটি আবিষ্কার করব এবং প্রোগ্রামটি চলবে না।

টীকা সহ, সবকিছু এত সহজ নয়: এখানে ত্রুটিটি রানটাইমে সনাক্ত করা হবে, যার অর্থ প্রোগ্রামটি শুরু হবে, তবে, আশ্চর্যজনকভাবে, এটি শেষ হবে না।

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


public class MyInteger implements Sum {}
interface Sum {};

public static void main(String[] args) throws IOException {
        increase(new MyInteger());
}
 
public static void increase(Sum count) {
        // TODO
}

একটি মার্কার ইন্টারফেস এখানে সবচেয়ে ভালো কাজ করে।

যখন আমাদের আরও কিছুর প্রয়োজন হয় তখন টীকা ব্যবহার করা ভাল, যেমন টীকা সমর্থন করে এমন প্যারামিটার৷

আসুন JDK-তে স্ট্যান্ডার্ড টীকা দেখি:

টীকা বর্ণনা উদাহরণ
@অগ্রাহ্য করা নির্দিষ্ট করে যে একটি পদ্ধতি একটি সুপারক্লাসের পদ্ধতিকে ওভাররাইড করে বা একটি বিমূর্ত শ্রেণি বা ইন্টারফেসের একটি পদ্ধতি প্রয়োগ করে।

@Override
public int hashCode() {
        return super.hashCode();
}
@অবঞ্চিত কোডকে অপ্রচলিত হিসাবে চিহ্নিত করে।

@Deprecated
public abstract void method();
@Suppress Warnings টীকাকৃত উপাদানের জন্য কম্পাইলার সতর্কতা অক্ষম করে। মনে রাখবেন যে আপনি যদি একাধিক বিভাগের সতর্কতা অক্ষম করতে চান, তবে সেগুলি অবশ্যই কোঁকড়া বন্ধনীতে আবদ্ধ থাকতে হবে, উদাহরণস্বরূপ @SuppressWarnings({"unchecked", "cast"})

public class DocumentsFolder {
   private List documents;

   @SuppressWarnings("unchecked")
public void addDocument(String document) {
            documents.add(document);
   }
}

এই উদাহরণে, আমরা এমন একটি তালিকা যোগ করার চেষ্টা করছি যার কোনো সংজ্ঞায়িত প্রকার নেই (একটি জেনেরিক টাইপ)। কম্পাইলার আমাদের এই বিষয়ে সতর্ক করবে। এটি খুব দরকারী, তবে কখনও কখনও অনেকগুলি "সতর্কতা" থাকে এবং সেগুলি গোলমাল হতে পারে। আপনি এই পদ্ধতির টীকা ব্যবহার করতে পারেন এবং আর্গুমেন্ট হিসাবে এক ধরনের কম্পাইলার সতর্কতা নির্দিষ্ট করতে পারেন। অনেকগুলি চিহ্নিতকারী রয়েছে, তাই সেগুলি মনে রাখার বিষয়ে চিন্তা করবেন না — IDEA সাধারণত আপনাকে বলবে কোনটি যোগ করতে হবে৷

একাধিক আর্গুমেন্ট সহ আরেকটি উদাহরণ:


@SuppressWarnings({"unchecked", "deprecated"})