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


171

পদ্ধতিটি যদি আপনি এনাম এপিটিতে দেখেন তবে name()এটি বলে যে:

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

কেন ব্যবহার করা ভাল toString()? আমি বলতে চাইছি নাম () ইতিমধ্যে চূড়ান্ত হলে টু স্ট্রিংকে ওভাররাইড করা যেতে পারে। সুতরাং আপনি যদি স্ট্রিং ব্যবহার করেন এবং কেউ যদি হার্ড কোডিং মানটি ফিরিয়ে দিতে ওভাররাইড করে তবে আপনার পুরো অ্যাপ্লিকেশনটি নিচে রয়েছে ... এছাড়াও যদি আপনি উত্সগুলি দেখেন তবে টসস্ট্রিং () পদ্ধতিটি ঠিক এবং কেবল নামটি ফিরে আসে। ইহা একই জিনিস.


4
আপনি toString()আপনার এনামে ওভাররাইড করতে পারেন , তবে অন্য কেউ এটিকে প্রসারিত ও ওভাররাইড করতে পারে না। আপনি enums প্রসারিত করতে পারবেন না।
এরিক জি.হ্যাগস্ট্রোম

উত্তর:


198

এটি প্রত্যাবর্তিত মানটির সাথে আপনি কী করতে চান তা নির্ভর করে:

  • আপনি সঠিক enum ধ্রুবক ঘোষণা করার জন্য ব্যবহৃত নাম পেতে প্রয়োজন হয়, আপনি ব্যবহার করা উচিত name()হিসাবে toStringহয়তো ওভাররাইড
  • আপনি যদি এনাম ধ্রুবকটি বন্ধুত্বপূর্ণ উপায়ে মুদ্রণ করতে চান তবে আপনার ব্যবহার করা উচিত toStringযা ওভাররাইডেন (বা না!) হতে পারে।

যখন আমি মনে করি এটি বিভ্রান্তিকর হতে পারে তখন আমি আরও নির্দিষ্ট getXXXপদ্ধতি সরবরাহ করি, উদাহরণস্বরূপ:

public enum Fields {
    LAST_NAME("Last Name"), FIRST_NAME("First Name");

    private final String fieldDescription;

    private Fields(String value) {
        fieldDescription = value;
    }

    public String getFieldDescription() {
        return fieldDescription;
    }
}

1
এটি গ্রহণযোগ্য। যদিও তারা এনামগুলিকে বেস ক্লাসের জিনিস রাখতে দেয় তবে তা সহজ হত।
ralphgabb

55

ব্যবহার করুন name()যখন আপনি একটি তুলনা করতে বা আপনার কোড মধ্যে কিছু অভ্যন্তরীণ ব্যবহারের জন্য হার্ডকোডেড মান ব্যবহার করতে চান।

ব্যবহার করুন toString()যখন আপনি একটি ব্যবহারকারী উপস্থিত তথ্য (ক developper একটি লগ দিকে তাকিয়ে সহ) করতে চান। toString()নির্দিষ্ট কোড দেওয়ার ক্ষেত্রে কখনও আপনার কোডের উপর নির্ভর করবেন না । এটি কখনই নির্দিষ্ট স্ট্রিংয়ের বিরুদ্ধে পরীক্ষা করবেন না। কেউ যদি সঠিকভাবে toString()রিটার্ন পরিবর্তন করে আপনার কোডটি যদি ভেঙে যায় তবে এটি ইতিমধ্যে ভেঙে গেছে।

জাভাডোক (জোর দেওয়া খনি) থেকে:

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


23

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

তুলনা MOBILE_PHONE_NUMBERএবং Mobile phone number। কোন সংস্করণটি বেশি পঠনযোগ্য? আমি বিশ্বাস করি দ্বিতীয়টি। এই পার্থক্যটি: name()সর্বদা ফিরে আসে MOBILE_PHONE_NUMBER, toString()ফিরে আসার জন্য ওভাররডেন হতে পারে Mobile phone number


16
এটা ঠিক নয় !! টাস্টস্ট্রিং () Mobile phone numberকেবল তখনই ফিরে আসে যদি আপনি এটিকে এই জাতীয় মান ফেরানোর জন্য ওভাররাইড করে। অন্যথায় এটি ফিরে আসবেMOBILE_PHONE_NUMBER
স্প্যানি

2
@ স্পাইনি, আপনার পক্ষে ওভাররাইড করতে হবে তা স্পষ্ট toString()। ক্যাচটি হ'ল name()এটি চূড়ান্ত হওয়ার কারণে ওভাররাইড করা যাবে না।
অ্যালেক্সার

13
@ অ্যালেক্সআর আপনার উপরের মন্তব্যটি এটির 100% সঠিক করার জন্য উত্তরের অন্তর্ভুক্ত করতে হতে পারে
artfully অনুমোদিত হয়েছে

5
আমি আপনার মতামতগুলি না পড়ার আগে পর্যন্ত এটি আমার কাছে স্পষ্ট ছিল না বলে আমি @artfullyContrived এর সাথে সম্মত।
মার্টিনাটিমে

13

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

অতিরিক্ত হিসাবে একজন ডেটাবেস থেকে ডি-সিরিয়ালও করতে পারেন, উদাহরণস্বরূপ, এটি সর্বদা জাভাতে কাজ করা উচিত:

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());

যদিও এটির নিশ্চয়তা নেই:

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toString());

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


2
উত্তর করার জন্য ধন্যবাদ. এই প্রশ্নটি জিজ্ঞাসা করে প্রায় 5 বছর হয়ে গেছে এবং আমি এখনও এনামের জন্য টস্ট্রিং () পদ্ধতিটি ব্যবহার করতে পারি নি! আপনি যেভাবে বর্ণনা করেছেন ঠিক তার জন্য আমি এনামগুলিকে 99% ব্যবহার করি: ডাটাবেসে / থেকে এনরিয়ামের নাম সিরিয়ালাইজিং এবং ডিসরিয়ালাইজিং।
spauny

5

নাম () এবং টো স্ট্রিং () আলাদা হওয়ার বিষয়টি বোঝার ক্ষেত্রে একটি ব্যবহারিক উদাহরণ এমন এক ধরণ যেখানে একক মূল্যবান এনামটি সিঙ্গলটনের সংজ্ঞা দিতে ব্যবহৃত হয়। এটি প্রথমে আশ্চর্যরূপে দেখায় তবে অনেকটা অর্থবোধ করে:

enum SingletonComponent {
    INSTANCE(/*..configuration...*/);

    /* ...behavior... */

    @Override
    String toString() {
      return "SingletonComponent"; // better than default "INSTANCE"
    }
}

এই ক্ষেত্রে:

SingletonComponent myComponent = SingletonComponent.INSTANCE;
assertThat(myComponent.name()).isEqualTo("INSTANCE"); // blah
assertThat(myComponent.toString()).isEqualTo("SingletonComponent"); // better

হ্যাঁ, আপনি ঠিক বলেছেন ... একটি ভাল উদাহরণ হল
পেয়ারার এনাম

4

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


-1

আপনি নীচের কোডের মতো কিছু ব্যবহার করতে পারেন। গেটরস এবং কনস্ট্রাক্টরের জন্য কিছু বয়লারপ্লেট কোড লেখা এড়াতে আমি লম্বোক ব্যবহার করেছি।

@AllArgsConstructor
@Getter
public enum RetroDeviceStatus {
    DELIVERED(0,"Delivered"),
    ACCEPTED(1, "Accepted"),
    REJECTED(2, "Rejected"),
    REPAIRED(3, "Repaired");

    private final Integer value;
    private final String stringValue;

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