এনাম মানকে কীভাবে রূপান্তর করবেন?


240

আমার একটি ফাংশন রয়েছে যা টাইপটি int দেয় return তবে, আমার কাছে কেবল ট্যাক্স গণনার একটি মান রয়েছে।

আমি কীভাবে একটি করের জন্য কর মূল্যায়ন কাস্ট করতে পারি?

public enum TAX {
    NOTAX(0),SALESTAX(10),IMPORTEDTAX(5);

    private int value;
    private TAX(int value){
        this.value = value;
    }
}

TAX var = TAX.NOTAX; // This value will differ

public int getTaxValue()
{
  // what do do here?
  // return (int)var;
}

উত্তর:


354

আপনার এনামকে valueকোনওভাবে উদঘাটন করা দরকার , যেমন

public enum Tax {
    NONE(0), SALES(10), IMPORT(5);

    private final int value;
    private Tax(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

...

public int getTaxValue() {
    Tax tax = Tax.NONE; // Or whatever
    return tax.getValue();
}

(আমি নামগুলি কিছুটা বেশি প্রচলিত এবং পাঠযোগ্য, বিটিডব্লু করে দিয়েছি))

এটি ধরে নিচ্ছে যে আপনি কনস্ট্রাক্টরে নির্ধারিত মান চান। যদি আপনি যা চান তা যদি না হয় তবে আপনাকে আমাদের আরও তথ্য সরবরাহ করতে হবে।


1
@ লাইকজিউজিৎসু: এটি বিপরীত দিকে চলছে। এই প্রশ্ন, অপ ইতিমধ্যে হয়েছে ধরনের একটি মান Tax, এবং তা থেকে সাংখ্যিক মান পেতে চায়।
জন স্কিটি

আমি কেবল এটি চেষ্টা করেছি এবং বুঝতে পারি যে এটি ব্যর্থ myEnumValue = MyEnum.valueOf(myInt);হয়েছে আরগটি স্ট্রিং টাইপের হতে হবে - বা আমি এখানে কিছু মিস করছি এমন কি?
likejudo

এই সমাধান কিছুই চেয়ে খারাপ। মনে হচ্ছে জাভাতে এনাম ব্যবহার করা উচিত নয়? নাকি জেডিকে ১.৮ বদলেছে?
ebyrob

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

209

আমি এটি পছন্দ করি:

public enum Color {

   White,

   Green,

   Blue,

   Purple,

   Orange,

   Red
}

তারপর:

//cast enum to int
int color = Color.Blue.ordinal();

34
এটি জোশুয়া ব্লচ তাঁর কার্যকর জাভা (২ য় সংস্করণ) বইয়ে প্রস্তাবিত / প্রস্তাবিত নয়। আইটেমটি দেখুন 31.
ব্যবহারকারী 504342

43
@ ব্যবহারকারী 504342 আমার কাছে বইটির ২ য় সংস্করণ নেই তবে আপনি দয়া করে কেন এটি সুপারিশ করা হয়নি তা আমাদের জানান?
লাইজডো

17
২ টি কারণ: একটি, নতুন ধ্রুবক যুক্ত করা থাকলে অস্থায়ী মান এবং ধ্রুবকগুলির মধ্যে যে কোনও সম্পর্ক ভেঙে যায় এবং দুটি এপিআই ডকস বিশেষভাবে এর বিপরীতে সুপারিশ করেন।
jordanpg

8
তাই পরিষ্কার এবং নিখুঁত। আমি কয়েকটি "এটি করবেন না" এবং "প্রস্তাবিত নয়" দেখছি। কেন এটি খারাপ বলে বিবেচনা করা হবে তা নিয়ে আমাকে গবেষণা করতে হবে। কিছু ফুলে যাওয়া নমুনাগুলি দেখতে খারাপ আইএমও দেখাচ্ছে look এত সাধারণ কাজ করতে এত বেশি কাজ।
হার্ব মীহান

4
একটি দলে আপনি নিশ্চিত যে আপনার সহ-বিকাশকারী মাঝখানে কোনও মান যুক্ত করবেন (শুরুতে আরও খারাপ), বা কেবল তাদের সাজান কারণ তাদের করার কিছুই নেই এবং কোডটি ব্যবহার করে .ordinal()
পুরোপুরি গোলমাল করুন

18

আপনি যদি কনস্ট্রাক্টরের জন্য নির্ধারিত মানটি চান তবে আপনাকে সেই মানটি ফেরত দিতে এনাম সংজ্ঞাতে একটি পদ্ধতি যুক্ত করতে হবে।

আপনি যদি একটি অনন্য নম্বর চান যা এনাম মানটি উপস্থাপন করে আপনি ব্যবহার করতে পারেন ordinal()


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

1
@ এডউইনবাক: এটি উল্লেখ করা ভাল, আমি কেবলমাত্র তার অস্তিত্বের কথা উল্লেখ করতে চেয়েছিলাম ordinal()কারণ ওপি এটি পরিষ্কার করে দেয়নি যে তিনি আসলে কী হতে চেয়েছিলেন।
আনহোলিস্যাম্পলার

অর্ডিনাল পাবেন না এ সম্পর্কে এনাম এপিআই চেক করুন। আপ-ভোট সরানো হয়েছে।
ইওলসের

3
আমি আশ্চর্য হয়েছি যে ordinal()এনামের মধ্যেই অভ্যন্তরীণভাবে ব্যবহার সম্পর্কে মানুষের ধারণা কী । উদাহরণস্বরূপ, আমি একটি enum "বলা বলার Season" যা মান ধারণ করে Spring, Summer, Autumn, এবং Winter, এবং এটি একটি পাবলিক পদ্ধতি ডেকেছেন next()যা ফেরৎ values()[(ordinal() + 1) % 4] বহিরাগত, কোন কোড কি কখনো পূরণবাচক সংখ্যা, দেখে এই enum অতিরিক্ত সদস্যদের হতে হবে না, সুতরাং এটি একটি বৈধ ব্যবহারের ক্ষেত্রে বলে মনে হচ্ছে।
ড্যারাল হফম্যান

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

12

কিছু সময় কিছু সি # পদ্ধতির ফলে জাভা বিশ্বে জীবন সহজ হয়ে যায় ..:

class XLINK {
static final short PAYLOAD = 102, ACK = 103, PAYLOAD_AND_ACK = 104;
}
//Now is trivial to use it like a C# enum:
int rcv = XLINK.ACK;

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

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

কোনও পদ্ধতির জন্য এনাম মান দেওয়ার চেষ্টা করার কি এই অসুবিধা নেই? আপনি কোনও পদ্ধতির জন্য আর একটি এক্স পাস করতে পারবেন না, কারণ এটি কোনও কংক্রিটের প্রতিনিধিত্ব করে না। আপনি আপনার পদ্ধতিতে টাইপিং হারাবেন। পদ্ধতিটির স্বাক্ষরটি XLINK এর পরিবর্তে ছোট পড়তে হবে।
ডাস্টিন জেনসেন

2

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

ValueType expected = ValueType.FLOAT;
String value = expected.name();

System.out.println("Name value: " + value);

ValueType actual = ValueType.valueOf(value);

if(expected.equals(actual)) System.out.println("Values are equal");

1
public enum Tax {

NONE(1), SALES(2), IMPORT(3);

private final int value;
    private Tax(int value) {
        this.value = value;
    }

    public String toString() {
        return Integer.toString(value);
    }
}

class Test {
    System.out.println(Tax.NONE);    //Just an example.
}

0

কিছুটা আলাদা পদ্ধতির (অন্তত অ্যান্ড্রয়েডে) অন্তর্নির্মিত ধরণের সেটগুলির সংমিশ্রণের জন্য ইন্টারডিফ টীকাটি ব্যবহার করা হয়

@IntDef({NOTAX, SALESTAX, IMPORTEDTAX})
@interface TAX {}
int NOTAX = 0;
int SALESTAX = 10;
int IMPORTEDTAX = 5;

ফাংশন প্যারামিটার হিসাবে ব্যবহার করুন:

void computeTax(@TAX int taxPercentage){...} 

বা একটি পরিবর্তনশীল ঘোষণা:

@TAX int currentTax = IMPORTEDTAX;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.