আমি কেন একটি স্ট্রিংয়ে স্যুইচ স্টেটমেন্ট ব্যবহার করতে পারি না?


1004

এই কার্যকারিতাটি কি পরবর্তী জাভা সংস্করণে রাখা হবে?

কেউ জাভাের switchবিবৃতিটি যেভাবে প্রযুক্তিগতভাবে কাজ করে, আমি কেন এটি করতে পারি না তা ব্যাখ্যা করতে পারে ?


195
এটি SE এর মধ্যে 7. এটির অনুরোধের 16 বছর পরে। ডাউনলোড.
oracle.com/javase/tutorial/java/nutsandbolts/…

81
সূর্য তাদের মূল্যায়নে সৎ ছিলেন: "Don't hold your breath."লোল, বাগসসন.বগড্যাটবেস
ভিউ_বাগ.ডো?

3
@ ইরফিয়ান আমার মনে হয় কারণ সে দু'বার দীর্ঘশ্বাস ফেলেছিল। তারা প্রায় 10 বছর পরে, জবাব দিতে কিছুটা দেরি করেছিল। সে তখন তার নাতি নাতনিদের কাছে মধ্যাহ্নভোজ বাক্সগুলি প্যাক করে।
WeirdElfB0y

উত্তর:


1003

Stringমামলাগুলির সাথে স্যুইচ স্টেটমেন্টগুলি জাভা এসই 7 এ প্রয়োগ করা হয়েছে , তাদের প্রথম অনুরোধের কমপক্ষে 16 বছর পরে। বিলম্বের জন্য একটি সুস্পষ্ট কারণ সরবরাহ করা হয়নি, তবে সম্ভবত এটির সম্পাদন কাজটি করতে হয়েছিল।

জেডিকে 7 তে বাস্তবায়ন

বৈশিষ্ট্যটি এখন javac একটি "ডি-চিনিকরণ" প্রক্রিয়া সহ প্রয়োগ করা হয়েছে ; ঘোষণায় Stringধ্রুবক ব্যবহার করে একটি পরিষ্কার, উচ্চ-স্তরের সিনট্যাক্স caseসংকলন-সময়ে আরও জটিল কোডে একটি প্যাটার্ন অনুসরণ করে প্রসারিত করা হয়। ফলাফলযুক্ত কোড JVM নির্দেশাবলী ব্যবহার করে যা সর্বদা বিদ্যমান থাকে।

একটি switchসঙ্গে Stringমামলা সংকলন করার সময় দুই সুইচ অনুবাদ করা হয়। প্রথমটি প্রতিটি স্ট্রিংকে একটি অনন্য পূর্ণসংখ্যার মানচিত্র দেয়। মূল স্যুইচটিতে এটির অবস্থান। এটি প্রথমে লেবেলের হ্যাশ কোডটি স্যুইচ করার মাধ্যমে করা হয়। সম্পর্কিত কেসটি একটি ifবিবৃতি যা স্ট্রিং সমতা পরীক্ষা করে; যদি হ্যাশটিতে সংঘর্ষ হয়, তবে পরীক্ষাটি একটি ক্যাসকেডিং if-else-if। দ্বিতীয় স্যুইচটি মূল উত্স কোডে মিরর করে, তবে কেস লেবেলগুলিকে তাদের সম্পর্কিত অবস্থানের সাথে প্রতিস্থাপন করে। এই দ্বি-পদক্ষেপ প্রক্রিয়াটি মূল স্যুইচটির প্রবাহ নিয়ন্ত্রণ সংরক্ষণ করা সহজ করে তোলে।

জেভিএম-এ স্যুইচ করে

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

যদি ধ্রুবকগুলি ঘন হয় তবে tableswitchসেগুলি নির্দেশিকার পয়েন্টগুলির একটি সারণিতে নির্দেশিকা হিসাবে (সর্বনিম্ন মানটি বিয়োগের পরে) ব্যবহার করা হয় used নির্দেশিকা —

যদি কনস্ট্যান্টগুলি খুব কম হয় তবে সঠিক কেসের জন্য বাইনারি অনুসন্ধান করা হয় — lookupswitchনির্দেশিকা।

ডি-sugaring সালে switchউপর Stringবস্তু, উভয় নির্দেশাবলী সম্ভাবনা বেশি ব্যবহৃত হবে। মামলার lookupswitchমূল অবস্থানটি খুঁজতে হ্যাশ কোডগুলিতে প্রথম স্যুইচের জন্য উপযুক্ত। ফলস্বরূপ অর্ডিনাল একটি এর জন্য প্রাকৃতিক ফিট tableswitch

উভয় নির্দেশাবলীর জন্য প্রতিটি ক্ষেত্রে নির্ধারিত পূর্ণসংখ্যার ধ্রুবকগুলি সংকলনের সময়ে বাছাই করা প্রয়োজন। রানটাইমে, সাধারণভাবে O(1)পারফরম্যান্সের tableswitchতুলনায় O(log(n))পারফরম্যান্স আরও ভালভাবে প্রদর্শিত হয় lookupswitch, তবে টেবিলে স্থান – সময়ের ট্রেড অফকে ন্যায্য প্রমাণ করার জন্য পর্যাপ্ত ঘন কিনা তা নির্ধারণ করার জন্য কিছু বিশ্লেষণ প্রয়োজন। বিল ভেনারস একটি দুর্দান্ত নিবন্ধ লিখেছেন যা এটি আরও বিশদভাবে কভার করেছে, সাথে জাভা প্রবাহ নিয়ন্ত্রণের অন্যান্য নির্দেশাবলীর নীচে নজর রাখার পাশাপাশি look

জেডিকে আগে 7

জেডিকে to এর আগে, enumপ্রায় Stringভিত্তিক সুইচটি হতে পারে । এটি প্রতিটি ধরণের সংকলক দ্বারা উত্পাদিত স্থিতিশীলvalueOf পদ্ধতি ব্যবহার করে enum। উদাহরণ স্বরূপ:

Pill p = Pill.valueOf(str);
switch(p) {
  case RED:  pop();  break;
  case BLUE: push(); break;
}

26
স্ট্রিং ভিত্তিক সুইচের জন্য হ্যাশের পরিবর্তে কেবল-যদি অন্যথায়-ইফ ব্যবহার করা দ্রুততর হতে পারে। আমি কয়েকটি আইটেম সংরক্ষণ করার সময় অভিধানগুলি বেশ ব্যয়বহুল বলে খুঁজে পেয়েছি।
জোনাথন অ্যালেন

84
একটি if-elseif-elseif-elseif-অন্যটি দ্রুত হতে পারে তবে আমি ক্লিনার কোডটি 100 এর মধ্যে 99 বার নিয়েছি St স্ট্রিংস, অপরিবর্তনীয় হওয়ায় তাদের হ্যাশ কোডটি ক্যাশে রাখে, তাই হ্যাশটি "কম্পিউটিং" দ্রুত হয়। কোনটি সুবিধা রয়েছে তা নির্ধারণ করতে একজনকে প্রোফাইল কোড করতে হবে।
এরিকসন

21
সুইচ (স্ট্রিং) যুক্ত করার বিরুদ্ধে যে কারণটি দেওয়া হয়েছে তা হ'ল এটি সুইচ () স্টেটমেন্ট থেকে প্রত্যাশিত পারফরম্যান্স গ্যারান্টি পূরণ করে না। তারা বিকাশকারীদের "বিভ্রান্ত" করতে চায় নি। সত্যি বলতে গেলে আমি মনে করি না যে তাদের সাথে সুইচ () শুরু করার গ্যারান্টি দেওয়া উচিত।
গিলি

2
যদি আপনি কেবলমাত্র Pillভিত্তিতে কিছু পদক্ষেপ গ্রহণের জন্য ব্যবহার করছেন strতবে আমি তর্ক করব যদি অন্যথায় ভাল হয় কারণ এটি আপনাকে strরেড রেডের বাইরে মানগুলি পরিচালনা করতে দেয় তবে ব্লু valueOfএর নামের বিরুদ্ধে কোনও ম্যাচ খোঁজেন না বা ম্যানুয়ালি পরীক্ষা করার প্রয়োজন ছাড়াই প্রতিটি অঙ্কের ধরণ যা কেবল অপ্রয়োজনীয় ওভারহেড যুক্ত করে। আমার অভিজ্ঞতায় এটি পরে কেবল valueOfস্ট্রিংয়ের মানের একটি টাইপসেফের উপস্থাপনার প্রয়োজন হলে একটি অঙ্কে রূপান্তরিত করার জন্য বোধগম্য হয়েছিল।
মাইলস হ্যাম্পসন

আমি ভাবছি যদি কম্পাইলার পরীক্ষা কোনো প্রচেষ্টা সংখ্যা (X, Y) যা মান সেট কোন যুগল আছে কিনা (hash >> x) & ((1<<y)-1)যে স্ট্রিংটির জন্য স্বতন্ত্র মান উত্পাদ হবে hashCodeভিন্ন, এবং (1<<y)স্ট্রিং দুইবার সংখ্যা কম (অথবা এ তার চেয়ে কম বেশি নয়)।
সুপারকেট

125

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

অবশ্যই আপনার গণনায় 'অন্যান্য' এবং একটি স্ট্রিং (স্ট্রিং) পদ্ধতিতে প্রবেশের প্রবেশ থাকতে পারে, তবে আপনি থাকতে পারেন

ValueEnum enumval = ValueEnum.fromString(myString);
switch (enumval) {
   case MILK: lap(); break;
   case WATER: sip(); break;
   case BEER: quaff(); break;
   case OTHER: 
   default: dance(); break;
}

4
এই কৌশলটি আপনাকে এ জাতীয় কেস সংবেদনশীলতা, উপকরণ ইত্যাদি সম্পর্কিত বিষয়ে সিদ্ধান্ত নিতে দেয়, পরিবর্তে কোনও ভাষা ডিজাইনারের উপর নির্ভর করে "এক আকারের সাথে সমস্ত মানিয়ে যায়" সমাধানটি আসে।
ডারন 21

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

18
এই পদ্ধতির একটি সুন্দর লিখন আপের জন্য xefer.com/2006/12/switchonstring দেখুন ।
ডেভিড স্মিট

@ ডেভিডস্মিট লেখার লেখার একটি বড় ত্রুটি রয়েছে। এটি মেথোড দ্বারা প্রকৃতপক্ষে ফেলে দেওয়া পরিবর্তে সমস্ত ব্যতিক্রম ধরা পড়ে।
এম মিম্পেন

91

নীচে জিবি পোস্টের উপর ভিত্তি করে একটি সম্পূর্ণ উদাহরণ দেওয়া হয়েছে, কাস্টম পদ্ধতি ব্যবহার না করে জাভা এনাম ব্যবহার করা।

নোট করুন যে জাভা এসই 7 এ এবং তারপরে আপনি তার পরিবর্তে স্যুইচ স্টেটমেন্টের অভিব্যক্তিতে একটি স্ট্রিং অবজেক্ট ব্যবহার করতে পারেন।

public class Main {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {

      String current = args[0];
      Days currentDay = Days.valueOf(current.toUpperCase());

      switch (currentDay) {
          case MONDAY:
          case TUESDAY:
          case WEDNESDAY:
              System.out.println("boring");
              break;
          case THURSDAY:
              System.out.println("getting better");
          case FRIDAY:
          case SATURDAY:
          case SUNDAY:
              System.out.println("much better");
              break;

      }
  }

  public enum Days {

    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
  }
}

26

পূর্ণসংখ্যার উপর ভিত্তি করে স্যুইচগুলি খুব কার্যকরী কোডে অনুকূলিত করা যায়। অন্যান্য ডেটা টাইপের উপর ভিত্তি করে স্যুইচগুলি কেবল যদি () স্টেটমেন্টের একটি সিরিজে সংকলন করা যায়।

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

সি # এর ডিজাইনাররা সিদ্ধান্ত নিয়েছিলেন যে কোনও সুবিধা না থাকলেও শৈলীটি গুরুত্বপূর্ণ।

জাভার ডিজাইনাররা দৃশ্যত সি এর ডিজাইনারদের মতো ভেবেছিল thought


26
যে কোনও হ্যাশেবল অবজেক্টের উপর ভিত্তি করে স্যুইচগুলি হ্যাশ টেবিলটি ব্যবহার করে খুব দক্ষতার সাথে প্রয়োগ করা যেতে পারে - দেখুন নেট। সুতরাং আপনার কারণ সম্পূর্ণ সঠিক নয়।
কনরাড রুডলফ

হ্যাঁ, এবং এই জিনিসটি আমি বুঝতে পারি না। তারা কি ভয় পাচ্ছে যে হ্যাশিং অবজেক্টগুলি দীর্ঘমেয়াদে খুব ব্যয়বহুল হয়ে উঠবে?
অ্যালেক্স বিয়ার্ডসলে

3
@ নালানডিয়াল: প্রকৃতপক্ষে, সংকলকের অংশে কিছুটা চেষ্টা করে, এটি মোটেও ব্যয়বহুল নয় কারণ যখন স্ট্রিংগুলির সেটটি জানা যায়, একটি নিখুঁত হ্যাশ তৈরি করা খুব সহজ (যদিও এটি নেট দ্বারা সম্পন্ন হয় না; প্রচেষ্টার জন্য সম্ভবত মূল্য নয়)।
কনরাড রুডল্ফ

3
@ নালানডিয়াল এবং @ কনরাদ রুডল্ফ - একটি স্ট্রিং হ্যাশ করার সময় (এটি অপরিবর্তনীয় প্রকৃতির কারণে) এই সমস্যার সমাধান হিসাবে মনে হচ্ছে আপনাকে মনে রাখতে হবে যে সমস্ত চূড়ান্ত অবজেক্টগুলি তাদের হ্যাশিং ফাংশনগুলিকে ওভাররাইড করতে পারে idden এটি সঙ্কলনের সময় একটি স্যুইচটিতে ধারাবাহিকতা নিশ্চিত করা কঠিন করে তোলে।
মার্টিনাটিমে

2
আপনি স্ট্রিংটির সাথে মেলে ডিএফএও তৈরি করতে পারেন (নিয়মিত এক্সপ্রেশন ইঞ্জিনের মতো)। হ্যাশিংয়ের চেয়ে সম্ভবত আরও দক্ষ।
নেট সি কে

19

String১.7 থেকে সরাসরি ব্যবহারের একটি উদাহরণও প্রদর্শিত হতে পারে:

public static void main(String[] args) {

    switch (args[0]) {
        case "Monday":
        case "Tuesday":
        case "Wednesday":
            System.out.println("boring");
            break;
        case "Thursday":
            System.out.println("getting better");
        case "Friday":
        case "Saturday":
        case "Sunday":
            System.out.println("much better");
            break;
    }

}

18

জেমস কারান সংক্ষেপে বলেছেন: "পূর্ণসংখ্যার উপর ভিত্তি করে স্যুইচগুলি খুব কার্যকরী কোডে অনুকূলিত করা যায় other যেহেতু এটি অন্যান্য ধরণের সাথে অর্থহীন ছিল "

আমার মতামত, এবং কেবলমাত্র এটি হ'ল আপনি অ-আদিমদের স্যুইচ করা শুরু করার সাথে সাথে আপনাকে "সমান" বনাম "==" সম্পর্কে ভাবনা শুরু করতে হবে। প্রথমত দুটি স্ট্রিংয়ের তুলনা করা মোটামুটি দীর্ঘ প্রক্রিয়া হতে পারে, যা উপরে বর্ণিত পারফরম্যান্স সমস্যাগুলিতে যোগ করে। দ্বিতীয়ত যদি স্ট্রিংগুলিতে স্যুইচিং হয় তবে স্ট্রিংগুলিকে অবহেলা করার ক্ষেত্রে স্যুইচ করা, স্থানীয় বিবেচনা করা / উপেক্ষা করার জন্য স্ট্রিংগুলিতে স্যুইচ করা, রেজেক্সের ভিত্তিতে স্ট্রিংগুলিতে স্যুইচ করার দাবি থাকবে .... আমি সেই সিদ্ধান্তকে অনুমোদিত করব যা তার জন্য অনেক সময় সাশ্রয় করেছে প্রোগ্রামারদের জন্য স্বল্প পরিমাণে ভাষা বিকাশকারী।


প্রযুক্তিগতভাবে, রেজিক্সগুলি ইতিমধ্যে "স্যুইচ" করে, কারণ তারা মূলত কেবলমাত্র রাষ্ট্রীয় মেশিন; তাদের কেবল মাত্র দুটি "কেস" রয়েছে, matchedএবং not matched। (যদিও [নামযুক্ত] গোষ্ঠীগুলি ইত্যাদি ইত্যাদি বিবেচনায় নেই)
জ্যাব

1
docs.oracle.com/javase/7/docs/technotes/guides/language/… সূচনা করে: জাভা সংকলক সাধারণত সুইচ স্টেটমেন্ট থেকে আরও কার্যকর বাইটকোড উত্পন্ন করে যা স্ট্রিং অবজেক্ট ব্যবহার করে শৃঙ্খলিত যদি-তবে-অন্য বিবৃতিগুলির চেয়ে বেশি।
উইম দেবলাউয়ে

12

উপরের ভাল যুক্তিগুলির পাশাপাশি, আমি আজ প্রচুর লোককে যুক্ত করব switch জাভা প্রক্রিয়াগত অতীতের অপ্রচলিত অবশিষ্ট হিসাবে (সি বারে ফিরে)

আমি এই মতামতটি সম্পূর্ণরূপে ভাগ করি switchনা , আমার ধারণা কমপক্ষে তার গতির কারণে কোনও কোনও ক্ষেত্রে এর উপযোগিতা থাকতে পারে এবং যাইহোক এটি কয়েকটি সিরিজের সংখ্যার চেয়ে বেশি ভালelse if কয়েকটি কোডে দেখেছি এমন ...

তবে প্রকৃতপক্ষে, আপনার যেখানে স্যুইচ প্রয়োজন সেই ক্ষেত্রেটি দেখার মতো এবং এটি আরও ওও দ্বারা কোনও প্রতিস্থাপন করা যায় না কিনা তা দেখুন। উদাহরণস্বরূপ জাভা 1.5+ এ এনামস, সম্ভবত হ্যাশ টেবিল বা অন্য কোনও সংগ্রহ (লুয়া-তে যেমন জাভাস্ক্রিপ্ট নেই - যা আমাদের কাছে প্রথম শ্রেণীর নাগরিক হিসাবে আমাদের (বেনামে) ফাংশন নেই এমন কিছু সময় আমি আফসোস করি) বা এমনকি পলিমারফিজম।


"একসময় আমি আফসোস করি যে
ব্যবহারকারী 8397947

@ ডোরুকায়হান অবশ্যই, হ্যাঁ তবে আপনি কি জাভা এর নতুন সংস্করণগুলিতে আপডেট করি তবে আমাদের কাছে সেগুলি থাকতে পারে তা বিশ্বকে জানানোর জন্য গত দশ বছর থেকে সমস্ত উত্তরে একটি মন্তব্য যুক্ত করতে চান? :-D
ফিলিপো

8

আপনি যদি JDK7 বা ততোধিক ব্যবহার না করে থাকেন তবে আপনি hashCode()এটি সিমুলেট করতে ব্যবহার করতে পারেন । কারণ String.hashCode()সাধারণত বিভিন্ন স্ট্রিংয়ের জন্য বিভিন্ন মান প্রদান করে এবং সর্বদা সমান স্ট্রিংয়ের জন্য সমান মান প্রদান করে, এটি মোটামুটি নির্ভরযোগ্য (বিভিন্ন স্ট্রিং একটি মন্তব্যে উল্লিখিত লিলির মতো একই হ্যাশ কোড তৈরি করতে পারে, যেমন "FB"এবং "Ea") ডকুমেন্টেশন দেখুন

সুতরাং, কোডটি এর মতো দেখাবে:

String s = "<Your String>";

switch(s.hashCode()) {
case "Hello".hashCode(): break;
case "Goodbye".hashCode(): break;
}

এইভাবে, আপনি প্রযুক্তিগতভাবে একটি চালু করতে চলেছেন int

বিকল্পভাবে, আপনি নিম্নলিখিত কোড ব্যবহার করতে পারেন:

public final class Switch<T> {
    private final HashMap<T, Runnable> cases = new HashMap<T, Runnable>(0);

    public void addCase(T object, Runnable action) {
        this.cases.put(object, action);
    }

    public void SWITCH(T object) {
        for (T t : this.cases.keySet()) {
            if (object.equals(t)) { // This means that the class works with any object!
                this.cases.get(t).run();
                break;
            }
        }
    }
}

5
দুটি ভিন্ন স্ট্রিংয়ে একই হ্যাশকোড থাকতে পারে, তাই আপনি যদি হ্যাশকোডগুলি স্যুইচ করেন তবে ভুল কেস-শাখা নেওয়া যেতে পারে।
লিই

@ লিআই এটি দেখানোর জন্য ধন্যবাদ! যদিও এটি অসম্ভব, তবে আমি এটি কাজ করে বিশ্বাস করব না। "এফবি" এবং "ইএ" এর একই হ্যাশকোড রয়েছে তাই সংঘর্ষের সন্ধান পাওয়া অসম্ভব। দ্বিতীয় কোডটি সম্ভবত আরও নির্ভরযোগ্য।
হাইপারনিউটারিনো

আমি এই সংকলনগুলি অবাক করে দিয়েছি, যেমন caseআমি বলেছিলাম যে বিবৃতিগুলি সবসময় ধ্রুবক মান হতে পারে এবং String.hashCode()এটি তেমন নয় (এমনকি বাস্তবে গণনা জেভিএমগুলির মধ্যে কখনও পরিবর্তিত হয়নি)।
স্ট্যাক্সম্যান

@ স্ট্যাকসম্যান এইচএম আকর্ষণীয়, আমি কখনও তা পর্যবেক্ষণ করতে থামিনি। তবে হ্যাঁ, caseসংকলনের সময় বিবৃতি মানগুলি নির্ধারণযোগ্য হবে না তাই এটি সূক্ষ্মভাবে কাজ করে।
হাইপারনিউটারিনো

4

কয়েক বছর ধরে আমরা এর জন্য একটি (এন ওপেন সোর্স) প্রিপ্রোসেসর ব্যবহার করে আসছি।

//#switch(target)
case "foo": code;
//#end

প্রাক প্রসেসড ফাইলগুলির নাম দেওয়া হয় Foo.jpp এবং পিঁপড়া স্ক্রিপ্টের সাহায্যে Foo.java তে প্রক্রিয়াজাত হয়।

সুবিধা হ'ল এটি জাভাতে প্রক্রিয়া করা হয় যা 1.0 এ চলে (যদিও সাধারণত আমরা কেবল 1.4 তে সমর্থন করি)। এছাড়াও এটি করা এনামস বা অন্যান্য কাজের সাথে তুলনা করার তুলনায় এটি (প্রচুর স্ট্রিং সুইচ) করা সহজ ছিল - কোডটি পড়া, রক্ষণাবেক্ষণ এবং বোঝার পক্ষে অনেক সহজ ছিল। আইআইআরসি (এই মুহুর্তে পরিসংখ্যান বা প্রযুক্তিগত যুক্তি সরবরাহ করতে পারে না) এটি প্রাকৃতিক জাভা সমতার চেয়েও দ্রুত ছিল।

অসুবিধাগুলি হ'ল আপনি জাভা সম্পাদনা করছেন না তাই এটি আরও কিছুটা ওয়ার্কফ্লো (সম্পাদনা, প্রক্রিয়া, সংকলন / পরীক্ষা) প্লাস কোনও আইডিই জাভাতে আবার লিঙ্ক করবে যা সামান্য বিভ্রান্ত হয় (যদি স্যুইচটি / অন্য যুক্তিযুক্ত পদক্ষেপের একটি সিরিজ হয়ে যায়) এবং স্যুইচ কেস অর্ডার বজায় রাখা হয় না।

আমি এটি 1.7+ এর জন্য প্রস্তাব দেব না তবে আপনি যদি জাভা প্রোগ্রাম করতে চান যা পূর্ববর্তী জেভিএমকে লক্ষ্য করে তোলে (যেহেতু জো পাবলিক খুব কমই সর্বশেষতম ইনস্টলড আছে)।

আপনি এটি এসভিএন থেকে পেতে পারেন বা কোডটি অনলাইনে ব্রাউজ করতে পারেন । এটি ঠিক যেমনটি তৈরি করতে আপনার ইবিল্ড লাগবে।


6
স্ট্রিং স্যুইচ সহ কোড চালানোর জন্য আপনার 1.7 জেভিএমের দরকার নেই। 1.7 সংকলক স্ট্রিং সুইচটিকে এমন কিছুতে রূপান্তর করে যা পূর্বে বিদ্যমান বাইট কোড ব্যবহার করে।
দাউদ ইবনে কেরেম

4

অন্যান্য উত্তরগুলি জানিয়েছে যে এটি জাভা in-এ যুক্ত করা হয়েছিল এবং পূর্ববর্তী সংস্করণগুলির জন্য কার্যপ্রণালী দেওয়া হয়েছিল। এই উত্তরটি "কেন" উত্তর দেওয়ার চেষ্টা করে

জাভা সি ++ এর অতিরিক্ত জটিলতার একটি প্রতিক্রিয়া ছিল। এটি একটি সাধারণ পরিষ্কার ভাষা হিসাবে তৈরি করা হয়েছিল।

স্ট্রিং ভাষায় কিছুটা বিশেষ কেস হ্যান্ডলিং পেয়েছিল তবে এটি আমার কাছে স্পষ্ট মনে হয় যে ডিজাইনাররা বিশেষ কেসিং এবং সিনট্যাকটিক চিনির পরিমাণ সর্বনিম্ন রাখার চেষ্টা করছেন were

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

1.0 এবং 1.4 এর মধ্যে ভাষা নিজে থেকেই বেশ একইরকম থাকে। জাভাতে বেশিরভাগ বর্ধিতাংশ ছিল লাইব্রেরির দিকে।

সমস্ত জাভা 5 দিয়ে পরিবর্তিত হয়েছে, ভাষাটি যথেষ্ট পরিমাণে প্রসারিত হয়েছিল। আরও এক্সটেনশনগুলি 7 এবং 8 সংস্করণে অনুসরণ করেছে আমি আশা করি যে মনোভাবের এই পরিবর্তনটি সি # এর উত্থানের দ্বারা পরিচালিত হয়েছিল


স্যুইচ (স্ট্রিং) সম্পর্কিত বিবরণ ইতিহাস, সময়রেখা, প্রসঙ্গ সিপিপি / সিএসের সাথে ফিট করে।
এস্প্রেসো

এই বৈশিষ্ট্যটি বাস্তবায়ন না করা একটি বড় ভুল ছিল, অন্য সব কিছুর অজুহাত জাভা বছরের পর বছর ধরে অনেক ব্যবহারকারীকে হারিয়েছিল কারণ ভাষার উন্নতি না করার জন্য অগ্রগতির অভাব এবং ডিজাইনারদের একগুঁয়েমি রয়েছে। ভাগ্যক্রমে তারা
জেডিকে

0

জেপি 354: জেডিকে -13 এবং জেপি 361 -এ স্যুইচ এক্সপ্রেশন (পূর্বরূপ) : জেডিকে -১ 14 এ স্যুইচ এক্সপ্রেশন (স্ট্যান্ডার্ড) সুইচ স্টেটমেন্টটি প্রসারিত করবেযাতে এটি একটি এক্সপ্রেশন হিসাবে ব্যবহার করা যায়

এখন তুমি পার:

  • সুইচ এক্সপ্রেশন থেকে সরাসরি পরিবর্তনশীল বরাদ্দ করুন ,
  • স্যুইচ লেবেলের নতুন ফর্ম ব্যবহার করুন (case L -> ):

    "কেস এল ->" স্যুইচ লেবেলের ডানদিকে কোডটি এক্সপ্রেশন, ব্লক বা (সুবিধার জন্য) একটি থ্রো স্টেটমেন্ট হিসাবে সীমাবদ্ধ।

  • প্রতি কেস প্রতি একাধিক স্থায়ী ব্যবহার করুন, কমা দ্বারা পৃথক করা,
  • এবং আরও কোন মান বিরতি আছে :

    একটি স্যুইচ এক্সপ্রেশন থেকে একটি মান উপার্জন করতে, breakমান বিবৃতি সহ একটি yieldস্টেটমেন্টের পক্ষে বাদ দেওয়া হয় ।

সুতরাং উত্তরগুলি থেকে ডেমো ( 1 , 2 ) এর মত দেখতে পারা যায়:

  public static void main(String[] args) {
    switch (args[0]) {
      case "Monday", "Tuesday", "Wednesday" ->  System.out.println("boring");
      case "Thursday" -> System.out.println("getting better");
      case "Friday", "Saturday", "Sunday" -> System.out.println("much better");
    }

-2

খুব সুন্দর নয়, তবে জাভা 6 এবং বেলোয়ের জন্য এখানে আরেকটি উপায় রয়েছে:

String runFct = 
        queryType.equals("eq") ? "method1":
        queryType.equals("L_L")? "method2":
        queryType.equals("L_R")? "method3":
        queryType.equals("L_LR")? "method4":
            "method5";
Method m = this.getClass().getMethod(runFct);
m.invoke(this);

-3

এটি গ্রোভির একটি হাওয়া; আমি গ্রোভি জার এম্বেড করে groovyএই সমস্ত কাজ করার জন্য একটি ইউটিলিটি ক্লাস তৈরি করেছি এবং যা যা জাভাতে করতে আমি ক্লান্তিহীন বলে মনে করি (যেহেতু আমি এন্টারপ্রাইজে জাভা 6 ব্যবহার করে আটকা পড়েছি।)

it.'p'.each{
switch (it.@name.text()){
   case "choclate":
     myholder.myval=(it.text());
     break;
     }}...

9
@ এসপোকি কারণ এটি একটি জাভা প্রশ্ন এবং একটি গ্রোভির উত্তর অফ-টপিক এবং একটি অকেজো প্লাগ।
মার্টিন 13

12
এমনকি রক্ষণশীল বৃহত এসডাব্লু ঘরগুলিতে জাভির সাথে গ্রোভি ব্যবহার করা হয়। সমাধানের জন্য সর্বাধিক প্রাসঙ্গিক প্রোগ্রামিং দৃষ্টান্তটি মিশ্রন করতে এবং ব্যবহারের জন্য জেভিএম এখন কোন ভাষার চেয়ে একটি ভাষা অজ্ঞেয় পরিবেশ দেয়। তাই সম্ভবত এখন আরও নিচু লোকদের সংগ্রহ করার জন্য আমার
ক্লোজারে

1
এছাড়াও, সিনট্যাক্সটি কীভাবে কাজ করে? আমি অনুমান করছি গ্রোভি একটি ভিন্ন প্রোগ্রামিং ভাষা ...? দুঃখিত। গ্রোভির সম্পর্কে আমি কিছু জানি না।
হাইপারনিউটারিনো

-4

আপনি যখন ইন্টেলিজ ব্যবহার করেন তখন এগুলিও দেখুন:

ফাইল -> প্রকল্পের কাঠামো -> প্রকল্প

ফাইল -> প্রকল্পের কাঠামো -> মডিউল

যখন আপনার একাধিক মডিউল রয়েছে তা নিশ্চিত করে নিন যে আপনি মডিউল ট্যাবে সঠিক ভাষার স্তর নির্ধারণ করেছেন।


1
আপনার উত্তর কীভাবে প্রশ্নের সাথে প্রাসঙ্গিক তা নিশ্চিত নয়। নীচের মতো স্ট্রিং সুইচ স্টেটমেন্ট কেন পাওয়া যায় না সে জিজ্ঞাসা করেছিলেন: স্ট্রিং মাইস্ট্রিং = "কিছু"; Switch (mystring) {কেস "কিছু" sysout ("এখানে পেয়েছি"); । । ।
দীপক আগরওয়াল

-8
public class StringSwitchCase { 

    public static void main(String args[]) {

        visitIsland("Santorini"); 
        visitIsland("Crete"); 
        visitIsland("Paros"); 

    } 

    public static void visitIsland(String island) {
         switch(island) {
          case "Corfu": 
               System.out.println("User wants to visit Corfu");
               break; 
          case "Crete": 
               System.out.println("User wants to visit Crete");
               break; 
          case "Santorini": 
               System.out.println("User wants to visit Santorini");
               break; 
          case "Mykonos": 
               System.out.println("User wants to visit Mykonos");
               break; 
         default: 
               System.out.println("Unknown Island");
               break; 
         } 
    } 

} 

8
ওপিতে স্ট্রিংটি কীভাবে স্যুইচ করা যায় তা জিজ্ঞাসা করছে না। জেডিকে before এর আগে সিনট্যাক্সের উপর বিধিনিষেধের কারণে তিনি / তিনি কেন সে সক্ষম হচ্ছেন না তা জিজ্ঞাসা করছেন।
হাইপারনিউটারিনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.