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

জাভাতে দুটি ধরণের সুইচ গঠন রয়েছে: সুইচ স্টেটমেন্ট এবং সুইচ এক্সপ্রেশন। 12 এবং 13 সংস্করণে দুটি অনানুষ্ঠানিক "প্রিভিউ" ভেরিয়েন্টে বিদ্যমান থাকার কারণে সুইচ এক্সপ্রেশনটি জাভা 14-এ অফিসিয়াল হয়ে ওঠে।

তবে শুরু থেকে শুরু করা যাক। আসুন মনে করি একটি ভাল পুরানো সুইচ 12 সংস্করণের আগে কেমন ছিল:

public String getProductTypeByName(String product) {
    String productType = "";

    switch (product) {
        case "Apple":
            productType = "Fruit";
            break;

        case "Peach":
            productType = "Fruit";
            break;

        case "Raspberry":
            productType = "Berry";
            break;

        case "Cherry":
            productType = "Berry";
            break;

        case "Tomato":
            productType = "Vegetable";
            break;

        default:
            productType = "other";
            break;
    }

    return productType;
}

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

Java 12 একটি পরীক্ষামূলক বৈশিষ্ট্যের সংযোজন দেখেছে: সুইচের একটি নতুন সংস্করণ - একটি সুইচ স্টেটমেন্ট নয়, কিন্তু একটি সুইচ এক্সপ্রেশন - যা একটি মান প্রদান করতে পারে, অভ্যন্তরীণভাবে কার্যকরী প্রোগ্রামিং ব্যবহার করতে পারে এবং একটি সাধারণ মান আছে এমন কেস স্টেটমেন্টগুলিকে একত্রিত করতে পারে, যার ফলে কম্প্যাক্ট নির্মাণ।

Java 12 এ, আপনি getProductTypeByName() পদ্ধতিটি নিম্নরূপ পুনরায় লিখতে পারেন:

public String getProductTypeByName(String product) {
    return switch (product) {
        case "Apple", "Peach" -> "Fruit";
        case "Raspberry", "Cherry" -> "Berry";
        case "Tomato" -> "Vegetable";
        default -> "other";

    };
}

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

যদি আমাদের শুধুমাত্র একটি ফলাফল ফেরত দিতে হয় না, তবে কোডের একাধিক লাইনও থাকে, তাহলে আমাদের সুইচটি দেখতে এইরকম হবে:

public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            break "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            break "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            break "Vegetable";
        }
        default -> {
            break "other";
        }

    };
     return result;
}

জাভা 13-এ, সুইচ এক্সপ্রেশনটি এখনও একটি পরীক্ষামূলক বৈশিষ্ট্য ছিল। এটি উপলব্ধ করার জন্য, জাভা 12-এর মতো, কম্পাইল এবং চালানোর সময় আপনাকে --enable-preview কমান্ডটি ব্যবহার করতে হবে। জাভা 13-এ স্যুইচের প্রধান, এবং শুধুমাত্র "উদ্ভাবন" হল ফলন কীওয়ার্ড, যা ব্রেক প্রতিস্থাপিত হয়েছে ।

public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            yield "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            yield "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            yield "Vegetables";
        }
        default -> {
            System.out.println("Other");
            yield "other";
        }

    };
    return result;
}

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

জাভা 14-এ, অপারেটরের উদাহরণ পরিবর্তিত হয়েছে এবং এখন এইভাবে ব্যবহার করা যেতে পারে:

if (o instanceof String s) {
s.toLowerCase();
}

কিছুটা কুৎসিত পুরানো উপায়ের পরিবর্তে যেখানে আপনাকে শুধুমাত্র instanceof ব্যবহার করে ভেরিয়েবলটি পরীক্ষা করতে হবে না , তবে এটি একটি নির্দিষ্ট টাইপে নিক্ষেপ করতে হবে।

if(s instanceof String) {
((String) s).toLowerCase();
}

এই পরিবর্তনগুলি অ্যাম্বার প্রকল্পের অংশ, যার লক্ষ্য জাভাতে প্যাটার্ন ম্যাচিং সমর্থন যোগ করা।

সংস্করণ 14-এ অপারেটরের পরিবর্তন এবং সংস্করণ 16-এ একটি এক্সটেনশনের পরিবর্তনের জন্য ধন্যবাদ, প্যাটার্ন ম্যাচিং এটিকে 17 সংস্করণে পরিণত করেছে। সত্য, এটি আপাতত শুধুমাত্র একটি পূর্বরূপ হিসাবে বিদ্যমান। আপনি --enable-preview দিয়ে এটি চেষ্টা করে দেখতে পারেন :

public String getObjectType(Object object) {
    return switch (object) {
        case Integer i -> "Integer";
        case Long l -> "Long";
        case String s -> "String";
        default -> object.toString();
    };
}

সাধারণভাবে, প্রতিটি নতুন সংস্করণ ভাষায় আরও বেশি আকর্ষণীয় বৈশিষ্ট্য নিয়ে আসে, যা জাভা বিকাশকে আরও শীতল করে তোলে।