এনস্ট্রিং এর স্ট্রিং তৈরি করার সেরা উপায়?


364

কোনও enumধরণের স্ট্রিংগুলির সেট উপস্থাপনের সর্বোত্তম উপায় কী ?

আমি এটি চেষ্টা করেছি:

enum Strings{
   STRING_ONE("ONE"), STRING_TWO("TWO")
}

তাহলে আমি তাদের কীভাবে ব্যবহার করতে পারি Strings?

উত্তর:


605

আপনি কী করতে চান তা আমি জানি না, তবে এইভাবে আমি আপনার উদাহরণ কোডটি অনুবাদ করেছি ...

package test;

/**
 * @author The Elite Gentleman
 *
 */
public enum Strings {
    STRING_ONE("ONE"),
    STRING_TWO("TWO")
    ;

    private final String text;

    /**
     * @param text
     */
    Strings(final String text) {
        this.text = text;
    }

    /* (non-Javadoc)
     * @see java.lang.Enum#toString()
     */
    @Override
    public String toString() {
        return text;
    }
}

বিকল্পভাবে, আপনি এর জন্য একটি গেটর পদ্ধতি তৈরি করতে পারেন text

আপনি এখন করতে পারেন Strings.STRING_ONE.toString();


3
আমি জানি না এটি সংকলক প্রয়োজন কিনা, তবে private String textচূড়ান্ত হওয়া উচিত।
জোনাথন

7
@ টমসের ন্যারোস হ্যাঁ, আপনি চূড়ান্ত ঘোষণার সময় আপনি যতক্ষণ এটির কোনও মূল্য না দেবেন ততক্ষণ আপনি নির্মাতাকে এটি নির্ধারণ করতে পারেন।
জোনাথন

28
@ দ্য এলিট জেন্টলম্যান রানটাইম চলাকালীন কোনও এনাম ধ্রুবকের মান পরিবর্তন করা খারাপ হবে, তাই প্রয়োজন না হলেও finalসবচেয়ে ভাল হবে be
জোনাথন

8
ভুলে যাবেন না যে কনস্ট্রাক্টর newহিসাবে এনামগুলি দিয়ে তৈরি করা যায় না private। মূলত, অবজেক্ট তৈরি নিষিদ্ধ এবং এক্ষেত্রে finalসত্যই প্রয়োজনীয় নয়।
বুহাকে সিন্ধি

6
@ বুহাকসিন্ডি: এটি সত্য, তবে দুর্ঘটনাক্রমে কেউ এনামের উপর ঝুঁকির ঝুঁকিতে পড়তে পারে setText(String)এবং এটি নরককে মুক্ত করতে পারে :) এই জাতীয় সংকলনের finalসহায়তার সাথে ধ্রুবক যে আপনার উদ্দেশ্যটি নথিভুক্ত করে। আপনি যদি Stringধ্রুবক ব্যবহার করেন তবে আপনি এটিকে ঠিক হিসাবে ঘোষণা করবেন না public static String?
TWiStErRob

104

এনুমের জন্য কাস্টম স্ট্রিংয়ের মান

http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html থেকে

জাভা এনুমের জন্য ডিফল্ট স্ট্রিং মানটি তার মুখের মান বা উপাদানটির নাম। তবে আপনি স্ট্রিং () পদ্ধতিতে ওভাররাইড করে স্ট্রিংয়ের মানটি কাস্টমাইজ করতে পারেন। উদাহরণ স্বরূপ,

public enum MyType {
  ONE {
      public String toString() {
          return "this is one";
      }
  },

  TWO {
      public String toString() {
          return "this is two";
      }
  }
}

নিম্নলিখিত পরীক্ষার কোডটি চালানো এটিকে উত্পাদন করবে:

public class EnumTest {
  public static void main(String[] args) {
      System.out.println(MyType.ONE);
      System.out.println(MyType.TWO);
  }
}


this is one
this is two

16
এটি এটি করার একটি দক্ষ উপায় নয় । এটি গণনায় প্রতিটি মানের জন্য একটি নতুন কাস্টম শ্রেণি তৈরি করে। উপরের উদাহরণে, আপনি binডিরেক্টরিতে নিম্নলিখিতটি দেখতে পাবেন : এনামটাইস্ট $ মাইটাইপ.ক্লাস এনামটাইস্ট $ মাইটাইপ $ 1 ক্লাস এনামটেষ্ট $ মাইটাইপ $ 2.class যা বাস্তব দ্রুত যোগ করবে । এনাম কনস্ট্রাক্টরকে মানগুলিতে পাঠিয়ে প্রত্যাশিত উত্তর হিসাবে এটি করা ভাল। আমি আসলে ওভাররাইডের সাথে একমত নই toString(); আমি বিশ্বাস করি যেমন একটি সুনির্দিষ্ট সংগ্রহকারী ব্যবহার করতে ভালো getKey()অগ্রাহ্য যেহেতু toString()enum এর অন্য কোনো ব্যবহারকারী অপ্রত্যাশিত হতে পারে।
ম্যাট কুইগলি

সম্পূর্ণরূপে @ ম্যাটকুইগলির সাথে একমত এটি করার ফলে ব্যবহারকারীদের যে জিনিসগুলির জন্য ব্যবহার করা উচিত নয় তার জন্য টস্ট্রিং ব্যবহার করতে উত্সাহিত করুন। আপনার যদি কোনও লেবেলের প্রয়োজন হয় তবে আপনি তার পরিবর্তে একটি লেবেল বৈশিষ্ট্য যুক্ত করতে চান
সেবাস্তিয়ান লরবার

এছাড়াও, অন্যভাবে অন্যদিকে যাওয়ার কোনও উপায় নেই (একটি স্ট্রিং থেকে এনাম অবজেক্টে) যা সম্ভবত কোনও পর্যায়ে প্রয়োজন হতে চলেছে।
অ্যাড্রিয়ান স্মিথ

টো স্ট্রিং ওভাররাইডিং মান মান () এর উপর প্রভাব ফেলবে না, তাই না?
দিমিত্রিউসন

69

এর name()পদ্ধতিটি ব্যবহার করুন :

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(Strings.ONE.name());
    }
}

enum Strings {
    ONE, TWO, THREE
}

ফলন ONE


17
হ্যাঁ, তবে Strings.STRING_ONE.name()"একক" নয়, "STRING_ONE" ফলন দেয়। এটি সহজ উত্তর নয়। আপনার কাছে এমন কোনও স্ট্রিং থাকতে পারে না যা বৈধ জাভা শনাক্তকারী ইত্যাদি হবে না
মার্ক পিটারস

2
@ মার্ক, সত্য, এটি কোনও চরিত্র পরিচালনা করতে পারে না। ওপি যদি কেবল একটি একক চর চায়, তবে এই দ্রষ্টব্যটি এলিট জেন্টলম্যান পরামর্শের চেয়ে আরও সোজা এগিয়ে forward তবে প্রকৃতপক্ষে: যদি কোনও বৈধ জাভা শনাক্তকারী থাকতে পারে এমন অক্ষরের পরিসর যদি ছাড়িয়ে যায় তবে এটি কোনও অগ্রগতি নয়। ভাল যুক্তি.
বার্ট কায়ার্স 20'10

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

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

এটি দুর্দান্ত। মানগুলি যেমন: var_name, var_superlong_but_not_toooooo_long_name, এমনকি ইত্যাদি (

18

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

enum Strings {
   STRING_ONE("ONE"), STRING_TWO("TWO");
   private final String stringValue;
   Strings(final String s) { stringValue = s; }
   public String toString() { return stringValue; }
   // further methods, attributes, etc.
}

শীর্ষে স্থির হওয়াগুলি এবং নীচে পদ্ধতিগুলি / বৈশিষ্ট্যগুলি থাকা গুরুত্বপূর্ণ।


এবং একটি প্রাইভেট কনস্ট্রাক্টরও থাকতে হবে।
বুহাকে সিন্ধি

1
এনাম কনস্ট্রাক্টরগুলি ডিফল্টরূপে ব্যক্তিগত এবং কোনও অ্যাক্সেস মডিফায়ার প্রয়োজন হয় না। তবে এটি অ্যাক্সেস মডিফায়ারগুলি সম্পর্কে সাধারণভাবে একটি ভাল বিষয় I
অ্যাড্রিয়ান স্মিথ

15

"এগুলি স্ট্রিং হিসাবে ব্যবহার করুন" বলতে আপনার বোঝার উপর নির্ভর করে আপনি এখানে কোনও এনাম ব্যবহার করতে চাইবেন না। বেশিরভাগ ক্ষেত্রেই, এলিট জেন্টলম্যান প্রস্তাবিত সমাধানটি আপনাকে তাদের টস্ট্রিং-পদ্ধতিগুলির মাধ্যমে ব্যবহার করতে দেয়, উদাহরণস্বরূপ System.out.println(STRING_ONE)বা এগুলি String s = "Hello "+STRING_TWO, তবে যখন আপনার সত্যিকারের স্ট্রিংস (উদাহরণস্বরূপ STRING_ONE.toLowerCase()) দরকার হয়, আপনি তাদের ধ্রুবক হিসাবে সংজ্ঞায়িত করতে পছন্দ করতে পারেন:

public interface Strings{
  public static final String STRING_ONE = "ONE";
  public static final String STRING_TWO = "TWO";      
}

5
আসলে এটাই আমি এড়াতে চাই ...!
ডরি

আসলে, তারা যদি toLowerCase()আমার সমাধানটিও চায় তবে তারা যেতে পারে Strings.STRING_TWO.toString().toLowerCase()
বুহাকে সিন্ধি

অবশ্যই, তবে এটি তার ব্যাখ্যা হিসাবে স্ট্রিং হিসাবে ব্যবহার করছে না। যেহেতু র্যাকহামের ব্যবহারের প্রয়োজন মনে হয় না, অবশ্যই তাঁর প্রস্তাবিত এনাম দ্রবণটি ব্যবহার করা উচিত।
hd42

6
আপনার কনস্ট্রাক্টর সহ interfaceকোনও finalক্লাসের জায়গায় ব্যবহার করা উচিত নয় private। এটি নিরুৎসাহিত অনুশীলন।
আলেকস এন।

1
@ মিলস, এনামগুলি ব্যবহার করে সমাধানগুলি একটি স্যুইচেও ঠিক কাজ করে। স্ট্রিংগুলির সরাসরি প্রয়োজন হলে আমি এই সমাধানটি সুপারিশ করব।
এইচডি 42

8

আপনি এটি স্ট্রিং এনুমের জন্য ব্যবহার করতে পারেন

public enum EnumTest {
    NAME_ONE("Name 1"),
    NAME_TWO("Name 2");

    private final String name;

    /**
     * @param name
     */
    private EnumTest(final String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

এবং মূল পদ্ধতি থেকে কল করুন

public class Test {
    public static void main (String args[]){
        System.out.println(EnumTest.NAME_ONE.getName());
        System.out.println(EnumTest.NAME_TWO.getName());
    }
}

5

আপনি যদি কনস্ট্রাক্টর ব্যবহার করতে না চান এবং আপনি এই পদ্ধতির কোনও বিশেষ নাম রাখতে চান তবে এটি ব্যবহার করে দেখুন:

public enum MyType {
  ONE {
      public String getDescription() {
          return "this is one";
      }
  },    
  TWO {
      public String getDescription() {
          return "this is two";
      }
  };

  public abstract String getDescription();
}

আমি সন্দেহ করি যে এটিই দ্রুত সমাধান। চূড়ান্ত চূড়ান্ত ব্যবহার করার প্রয়োজন নেই ।


তবে এটির সাথে আপনাকে এখনও getDescript () কল করতে হবে যার মধ্যে জিজ্ঞাসাবাদী একজনকে কল করতে বা ধ্রুবক হিসাবে এটি অ্যাক্সেস করতে চায়।
কিনসলে কাজিভা

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

0

ডিফল্ট মান সহ সেট করুন এবং সেট করুন।

public enum Status {

    STATUS_A("Status A"),  STATUS_B("Status B"),

    private String status;

    Status(String status) {
        this.status = status;
    }

    public String getStatus() {
        return status;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.