উত্তর:
হ্যাঁ, Blah.valueOf("A")
আপনাকে দেবে Blah.A
।
নোট করুন যে নামটি অবশ্যই কেস সহ একটি যথাযথ মিল হতে পারে : Blah.valueOf("a")
এবং Blah.valueOf("A ")
উভয়ই একটি নিক্ষেপ করে IllegalArgumentException
।
স্থিতিশীল পদ্ধতিগুলি valueOf()
এবং values()
সংকলন সময়ে তৈরি করা হয় এবং উত্স কোডে উপস্থিত হয় না। যদিও তারা জাভাদোকে উপস্থিত হয়; উদাহরণস্বরূপ, Dialog.ModalityType
উভয় পদ্ধতি দেখায়।
toString()
মানটি বোঝাতে চান , না, আমি এটি বলব না। name()
আপনি এনাম ধ্রুবকের প্রকৃত সংজ্ঞায়িত নামটি পাবেন যদি না আপনি এটিকে ওভাররাইড করে।
enum Blah {...}
সংজ্ঞা নিজস্ব ডিক্লেয়ার করার চেষ্টা করা উচিত নয় values
কিংবা valuesOf
। এটি এমন কী আপনি কীভাবে "যে কোনও টাইপনাম.ক্লাস" লিখতে পারেন তা সত্ত্বেও আপনি বাস্তবে কোনও "শ্রেণি" সদস্যের পরিবর্তনশীল ঘোষণা করেননি; সংকলক এটি সব ঠিক কাজ করে তোলে। (এই উত্তরটি 3 মাস পরে আপনার পক্ষে আর কার্যকর নাও হতে পারে তবে কেবল ক্ষেত্রে))
আর একটি সমাধান যদি পাঠ্যটি গণনা মানের মতো হয় না:
public enum Blah {
A("text1"),
B("text2"),
C("text3"),
D("text4");
private String text;
Blah(String text) {
this.text = text;
}
public String getText() {
return this.text;
}
public static Blah fromString(String text) {
for (Blah b : Blah.values()) {
if (b.text.equalsIgnoreCase(text)) {
return b;
}
}
return null;
}
}
throw new IllegalArgumentException("No constant with text " + text + " found")
চেয়ে ভাল হবে return null
।
এখানে আমি ব্যবহার করছি একটি নিফটি ইউটিলিটি:
/**
* A common method for all enums since they can't have another base class
* @param <T> Enum type
* @param c enum type. All enums must be all caps.
* @param string case insensitive
* @return corresponding enum, or null
*/
public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string) {
if( c != null && string != null ) {
try {
return Enum.valueOf(c, string.trim().toUpperCase());
} catch(IllegalArgumentException ex) {
}
}
return null;
}
তারপরে আমার এনাম ক্লাসে আমার সাধারণত কিছু টাইপিং সংরক্ষণ করার জন্য এটি থাকে:
public static MyEnum fromString(String name) {
return getEnumFromString(MyEnum.class, name);
}
যদি আপনার এনামগুলি সমস্ত ক্যাপ না থাকে তবে কেবল Enum.valueOf
লাইনটি পরিবর্তন করুন ।
এটা খুব খারাপ, আমি ব্যবহার করতে পারবেন না T.class
জন্য Enum.valueOf
যেমন T
মুছে ফেলা হয়।
জোশুয়া ব্লচ, কার্যকর জাভা থেকে প্যাটার্নটি ব্যবহার করুন :
(বংশবৃদ্ধির জন্য সরলীকৃত)
enum MyEnum {
ENUM_1("A"),
ENUM_2("B");
private String name;
private static final Map<String,MyEnum> ENUM_MAP;
MyEnum (String name) {
this.name = name;
}
public String getName() {
return this.name;
}
// Build an immutable map of String name to enum pairs.
// Any Map impl can be used.
static {
Map<String,MyEnum> map = new ConcurrentHashMap<String, MyEnum>();
for (MyEnum instance : MyEnum.values()) {
map.put(instance.getName(),instance);
}
ENUM_MAP = Collections.unmodifiableMap(map);
}
public static MyEnum get (String name) {
return ENUM_MAP.get(name);
}
}
আরও দেখুন:
এনাম এবং দৃষ্টান্তের মানচিত্র ব্যবহার করে ওরাকল জাভা উদাহরণ
Stream.of(MyEnum.values()).collect(toMap(Enum::name, identity()))
তেও সহজতর করতে পারেন: আমিও স্ট্রিং () (কন্সট্রাক্টরের মাধ্যমে পাস করা) ওভাররাইড করার এবং নামের পরিবর্তে এটি ব্যবহার করার পরামর্শ দিচ্ছি, বিশেষত এনুম সিরিয়ালীকরণযোগ্য ডেটার সাথে যুক্ত কারণ এটি আপনাকে না দিয়ে কেসিং নিয়ন্ত্রণ করতে দেয় সোনার ফিট।
unmodifiableMap
যাইহোক এটি এড়াতে যাচ্ছেন , তবে এটি দিয়ে আর কোনও লাভ নেই ConcurrentHashMap
। শুধু একটি ব্যবহার করুন HashMap
। (আপনার যদি পেয়ারা থাকে ImmutableMap
তবে আমি তার পরিবর্তে
ConcurrentHashMap
এখানে ব্যবহার করার একেবারেই কারণ নেই, যেখানে মানচিত্র আরম্ভের পরে আর কখনও পরিবর্তন হয় না। সুতরাং কেন এমনকি উদাহরণস্বরূপ জেএলএসে নিজেই একটি নিয়মিত ব্যবহার করে HashMap
।
আপনার কেস সম্পর্কে আপনারও যত্নবান হওয়া উচিত। আমাকে বোঝাতে দাও: Blah.valueOf("A")
কাজ করছে , কিন্তু Blah.valueOf("a")
কাজ করবে না। তারপর আবার Blah.valueOf("a".toUpperCase(Locale.ENGLISH))
কাজ করবে।
সম্পাদন করা
পরিবর্তিত toUpperCase
করার toUpperCase(Locale.ENGLISH)
উপর ভিত্তি করে TC। মন্তব্য এবং জাভা ডক্স
edit2
অ্যান্ড্রয়েডে আপনার ব্যবহার করা উচিত Locale.US
, যেমন সুলাই পয়েন্ট করে ।
Locale.US
মেশিনে পঠনযোগ্য ইনপুট / আউটপুট ব্যবহারের জন্য স্পষ্টভাবে উত্সাহ দেয় ।
এখানে এমন একটি পদ্ধতি রয়েছে যা এটি কোনও এনুমের জন্য করতে পারে এবং এটি সংবেদনশীল।
/**
* Finds the value of the given enumeration by name, case-insensitive.
* Throws an IllegalArgumentException if no match is found.
**/
public static <T extends Enum<T>> T valueOfIgnoreCase(
Class<T> enumeration, String name) {
for (T enumValue : enumeration.getEnumConstants()) {
if (enumValue.name().equalsIgnoreCase(name)) {
return enumValue;
}
}
throw new IllegalArgumentException(String.format(
"There is no value with name '%s' in Enum %s",
name, enumeration.getName()
));
}
equalsIgnoreCase
যাওয়ার উপায়। +1
ব্যবহার Blah.valueOf(string)
সেরা তবে আপনি Enum.valueOf(Blah.class, string)
পাশাপাশি ব্যবহার করতে পারেন ।
জাভা 8 বা তারপরে , স্ট্রিম ব্যবহার করে :
public enum Blah
{
A("text1"),
B("text2"),
C("text3"),
D("text4");
private String text;
Blah(String text) {
this.text = text;
}
public String getText() {
return this.text;
}
public static Optional<Blah> fromText(String text) {
return Arrays.stream(values())
.filter(bl -> bl.text.equalsIgnoreCase(text))
.findFirst();
}
}
আপনি যদি নিজের নিজস্ব ইউটিলিটি লিখতে না চান তবে গুগলের ব্যবহার করুন পেয়ারা গ্রন্থাগার:
Enums.getIfPresent(Blah.class, "A")
জাভা ফাংশনে অন্তর্নির্মিতের বিপরীতে এটি আপনাকে পরীক্ষা করতে পারে যে ব্লাহে উপস্থিত রয়েছে এবং কোনও ব্যতিক্রম ছুঁড়ে না ফেলে।
আমার 2 সেন্ট এখানে: জাভা 8 স্ট্রিম ব্যবহার করে + একটি সঠিক স্ট্রিং পরীক্ষা করছে:
public enum MyEnum {
VALUE_1("Super"),
VALUE_2("Rainbow"),
VALUE_3("Dash"),
VALUE_3("Rocks");
private final String value;
MyEnum(String value) {
this.value = value;
}
/**
* @return the Enum representation for the given string.
* @throws IllegalArgumentException if unknown string.
*/
public static MyEnum fromString(String s) throws IllegalArgumentException {
return Arrays.stream(MyEnum.values())
.filter(v -> v.value.equals(s))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("unknown value: " + s));
}
}
** সম্পাদনা করুন **
fromString()
সেই কনভেনশনটি ব্যবহার করে নামকরণ করার পরে ফাংশনটির নামকরণ করা, আপনি জাভা ভাষা থেকে কিছু সুবিধা পাবেন; উদাহরণ স্বরূপ:
switch
ব্লক লেখার অনুমতি দেওয়ার জন্য আপনি এর .orElse(null)
পরিবর্তে ক্লজটিতে .orElseThrow()
থাকা ব্যতিক্রমটিকে কোড করতে পারেন default
- এবং প্রয়োজনের সময় আরও দরকারী তথ্য অন্তর্ভুক্ত করতে পারেন। এবং এটিকে আরও হালকা করার জন্য আপনি ব্যবহার করতে পারেনv -> Objects.equals(v.name, s == null ? "" : s.trim().toUpperCase())
Optional
থেকে ফিরে findFirst()
.orElse(null)
orElseThrow()
আপনার এটি প্রয়োজন হতে পারে:
public enum ObjectType {
PERSON("Person");
public String parameterName;
ObjectType(String parameterName) {
this.parameterName = parameterName;
}
public String getParameterName() {
return this.parameterName;
}
//From String method will return you the Enum for the provided input string
public static ObjectType fromString(String parameterName) {
if (parameterName != null) {
for (ObjectType objType : ObjectType.values()) {
if (parameterName.equalsIgnoreCase(objType.parameterName)) {
return objType;
}
}
}
return null;
}
}
আরও একটি সংযোজন:
public static String fromEnumName(String parameterName) {
if (parameterName != null) {
for (DQJ objType : DQJ.values()) {
if (parameterName.equalsIgnoreCase(objType.name())) {
return objType.parameterName;
}
}
}
return null;
}
এটি আপনাকে স্ট্রিংফাইড এনাম নাম দিয়ে মান প্রদান করবে যেমন উদাহরণস্বরূপ আপনি যদি এনাম নাম থেকে "ব্যক্তি" সরবরাহ করেন তবে এটি আপনাকে এনামের মান অর্থাৎ "ব্যক্তি" ফিরিয়ে দেবে
name()
এনুমের অন্তর্নিহিত স্থির পদ্ধতি ব্যবহার করে এটি করার আর একটি উপায় । নামটি এনাম তৈরি করতে ব্যবহৃত সঠিক স্ট্রিংটি ফিরিয়ে দেবে যা সরবরাহিত স্ট্রিংয়ের বিরুদ্ধে যাচাই করতে ব্যবহৃত হতে পারে:
public enum Blah {
A, B, C, D;
public static Blah getEnum(String s){
if(A.name().equals(s)){
return A;
}else if(B.name().equals(s)){
return B;
}else if(C.name().equals(s)){
return C;
}else if (D.name().equals(s)){
return D;
}
throw new IllegalArgumentException("No Enum specified for this string");
}
}
পরীক্ষামূলক:
System.out.println(Blah.getEnum("B").name());
//it will print B B
অনুপ্রেরণা: জাভাতে এনামের 10 টি উদাহরণ
valueOf
আপনার জন্য কি করে। এই স্থিতিশীল পদ্ধতি অতিরিক্ত, ব্যতিক্রম এবং সমস্ত কিছু সরবরাহ করে না। তারপরে যদি / অন্য নির্মাণগুলি অত্যন্ত বিপজ্জনক ... যে কোনও নতুন এনাম ধ্রুবক যুক্ত হওয়া এই পদ্ধতিটি কোনও পরিবর্তন ছাড়াই ভেঙে দেবে।
name()
স্থির নয়।
পেয়ারা লাইব্রেরি ব্যবহার করে সমাধান। পদ্ধতি getPlanet () কেস সংবেদনশীল, সুতরাং getPlanet ("MerCUrY") প্ল্যানেট প্রত্যাবর্তন করবে MMERCURY।
package com.universe.solarsystem.planets;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Enums;
import com.google.common.base.Optional;
//Pluto and Eris are dwarf planets, who cares!
public enum Planet {
MERCURY,
VENUS,
EARTH,
MARS,
JUPITER,
SATURN,
URANUS,
NEPTUNE;
public static Planet getPlanet(String name) {
String val = StringUtils.trimToEmpty(name).toUpperCase();
Optional <Planet> possible = Enums.getIfPresent(Planet.class, val);
if (!possible.isPresent()) {
throw new IllegalArgumentException(val + "? There is no such planet!");
}
return possible.get();
}
}
পূর্ববর্তী উত্তরগুলি যুক্ত করতে এবং নাল এবং এনপিই-র কাছাকাছি কিছু আলোচনার সমাধান করতে আমি অনুপস্থিত / অবৈধ মামলাগুলি পরিচালনা করতে পেয়ারা বিকল্পগুলি ব্যবহার করছি। এটি ইউআরআই / পরামিতি পার্সিংয়ের জন্য দুর্দান্ত কাজ করে।
public enum E {
A,B,C;
public static Optional<E> fromString(String s) {
try {
return Optional.of(E.valueOf(s.toUpperCase()));
} catch (IllegalArgumentException|NullPointerException e) {
return Optional.absent();
}
}
}
যাদের সচেতন নয় তাদের জন্য এখানে Forচ্ছিক সহ নাল এড়ানো সম্পর্কে আরও কিছু তথ্য রয়েছে: https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained# বিকল্প
জাভা 8 এ স্থিতিশীল মানচিত্রের প্যাটার্নটি আরও সহজ এবং এটি আমার প্রিফার্ড পদ্ধতি। আপনি যদি জ্যাকসনের সাথে এনাম ব্যবহার করতে চান তবে আপনি টু স্ট্রিংকে ওভাররাইড করতে পারেন এবং নামের পরিবর্তে সেটি ব্যবহার করতে পারেন, তারপরে এনোটেট করুন@JsonValue
public enum MyEnum {
BAR,
BAZ;
private static final Map<String, MyEnum> MAP = Stream.of(MyEnum.values()).collect(Collectors.toMap(Enum::name, Function.identity()));
public static MyEnum fromName(String name){
return MAP.get(name);
}
}
public enum MyEnumForJson {
BAR("bar"),
BAZ("baz");
private static final Map<String, MyEnumForJson> MAP = Stream.of(MyEnumForJson.values()).collect(Collectors.toMap(Object::toString, Function.identity()));
private final String value;
MyEnumForJson(String value) {
this.value = value;
}
@JsonValue
@Override
public String toString() {
return value;
}
public static MyEnumForJson fromValue(String value){
return MAP.get(value);
}
}
public static MyEnum getFromValue(String value) {
MyEnum resp = null;
MyEnum nodes[] = values();
for(int i = 0; i < nodes.length; i++) {
if(nodes[i].value.equals(value)) {
resp = nodes[i];
break;
}
}
return resp;
}
হে (1) পদ্ধতিটি হ্যাশম্যাপ ব্যবহার করে এমন বিকাশযুক্ত কোড থেকে অনুপ্রাণিত।
public enum USER {
STUDENT("jon",0),TEACHER("tom",1);
private static final Map<String, Integer> map = new HashMap<>();
static {
for (USER user : EnumSet.allOf(USER.class)) {
map.put(user.getTypeName(), user.getIndex());
}
}
public static int findIndexByTypeName(String typeName) {
return map.get(typeName);
}
private USER(String typeName,int index){
this.typeName = typeName;
this.index = index;
}
private String typeName;
private int index;
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
এনুম খুব দরকারী, আমি Enum
নীচের উদাহরণ হিসাবে বিভিন্ন ভাষায় কিছু ক্ষেত্রের জন্য বর্ণনা যুক্ত করতে প্রচুর ব্যবহার করছি :
public enum Status {
ACT(new String[] { "Accepted", "مقبول" }),
REJ(new String[] { "Rejected", "مرفوض" }),
PND(new String[] { "Pending", "في الانتظار" }),
ERR(new String[] { "Error", "خطأ" }),
SNT(new String[] { "Sent", "أرسلت" });
private String[] status;
public String getDescription(String lang) {
return lang.equals("en") ? status[0] : status[1];
}
Status(String[] status) {
this.status = status;
}
}
এবং তারপরে আপনি getDescription(String lang)
পদ্ধতিটিতে পাস করা ভাষা কোডের ভিত্তিতে গতিশীলভাবে বর্ণনাটি পুনরুদ্ধার করতে পারেন , উদাহরণস্বরূপ:
String statusDescription = Status.valueOf("ACT").getDescription("en");
java.lang.Enum
বেশ কয়েকটি দরকারী পদ্ধতি নির্ধারণ করে যা জাভাতে সমস্ত গণনা প্রকারের জন্য উপলভ্য:
name()
কোনও এনাম ধ্রুবকের নাম পেতে আপনি পদ্ধতিটি ব্যবহার করতে পারেন । স্ট্রিং আক্ষরিক এনাম কনস্ট্যান্ট লিখতে ব্যবহৃত হয় তাদের নাম।values()
এনাম টাইপ থেকে সমস্ত এনাম ধ্রুবকের অ্যারে পেতে পদ্ধতি ব্যবহার করা যেতে পারে।valueOf()
নীচে দেখানো মতো কোনও স্ট্রিংকে জাভাতে এনাম ধ্রুবকে রূপান্তর করতে পদ্ধতি ব্যবহার করতে পারেন ।public class EnumDemo06 {
public static void main(String args[]) {
Gender fromString = Gender.valueOf("MALE");
System.out.println("Gender.MALE.name() : " + fromString.name());
}
private enum Gender {
MALE, FEMALE;
}
}
Output:
Gender.MALE.name() : MALE
এই কোড স্নিপেট ইন, valueOf()
পদ্ধতি ফেরৎ একটি Enum ধ্রুবক Gender.MALE, যে আয় নাম কলিং "MALE"
।
অ্যাপাচি এর কমন্স-ল্যাং লাইব্রেরিতে একটি স্থির ফাংশন রয়েছে org.apache.commons.lang3.EnumUtils.getEnum যা আপনার এনুম টাইপের একটি স্ট্রিং মানচিত্র তৈরি করবে। জেফরি হিসাবে মূলত একই উত্তর কিন্তু বারণের মধ্যে ইতিমধ্যে যখন আপনার নিজের রোল কেন।
একটি সহায়ক ইউটিলিটি সহ শীর্ষের রেট করা উত্তরে যুক্ত করা হচ্ছে ...
valueOf()
এটির ইনপুট পছন্দ না করে এমন ক্ষেত্রে দুটি পৃথক ব্যতিক্রম ছোঁড়ে।
IllegalArgumentException
NullPointerExeption
যদি আপনার প্রয়োজনীয়তাগুলি এমন হয় যে আপনার স্ট্রিং অবশ্যই একটি এনাম মানের সাথে মেলে এমন কোনও গ্যারান্টি নেই আপনার উদাহরণস্বরূপ, যদি স্ট্রিং ডেটাবেস থেকে আসে এবং এনামের পুরাতন সংস্করণ থাকতে পারে তবে আপনাকে এগুলি পরিচালনা করতে হবে প্রায়ই ...
সুতরাং আমি এখানে একটি পুনর্ব্যবহারযোগ্য পদ্ধতি যা আমাদের লিখেছিল যা আমাদের ডিফল্ট এনামকে ফেরত দেওয়ার সংজ্ঞা দেয় যদি আমরা পাস করা স্ট্রিংটি মেলে না।
private static <T extends Enum<T>> T valueOf( String name , T defaultVal) {
try {
return Enum.valueOf(defaultVal.getDeclaringClass() , name);
} catch (IllegalArgumentException | NullPointerException e) {
return defaultVal;
}
}
এটি এর মতো ব্যবহার করুন:
public enum MYTHINGS {
THINGONE,
THINGTWO
}
public static void main(String [] asd) {
valueOf("THINGTWO" , MYTHINGS.THINGONE);//returns MYTHINGS.THINGTWO
valueOf("THINGZERO" , MYTHINGS.THINGONE);//returns MYTHINGS.THINGONE
}
হিসেবে switch
-version উল্লেখ করা হয় নি এখনো আমি এটা চালু (ওপি এর enum পুনঃব্যবহার):
private enum Blah {
A, B, C, D;
public static Blah byName(String name) {
switch (name) {
case "A":
return A;
case "B":
return B;
case "C":
return C;
case "D":
return D;
default:
throw new IllegalArgumentException(
"No enum constant " + Blah.class.getCanonicalName() + "." + name);
}
}
}
যেহেতু এটি valueOf(String name)
পদ্ধতির কোনও অতিরিক্ত মান দেয় না , তাই আমরা যদি অন্যরকম আচরণ করতে চাই তবে একটি অতিরিক্ত পদ্ধতি সংজ্ঞায়িত করা বোধগম্য হয়। আমরা যদি বাড়াতে না চাই তবে আমরা IllegalArgumentException
বাস্তবায়নটি এতে পরিবর্তন করতে পারি:
private enum Blah {
A, B, C, D;
public static Blah valueOfOrDefault(String name, Blah defaultValue) {
switch (name) {
case "A":
return A;
case "B":
return B;
case "C":
return C;
case "D":
return D;
default:
if (defaultValue == null) {
throw new NullPointerException();
}
return defaultValue;
}
}
}
ডিফল্ট মান প্রদান করার মাধ্যমে আমরা রাখা চুক্তি এর Enum.valueOf(String name)
একটি নিক্ষেপ ছাড়া IllegalArgumentException
যে যেভাবে অভিযোগের মধ্যে যে কোন ক্ষেত্রে null
ফিরিয়ে দেওয়া হয়। অতএব আমরা নিক্ষেপ NullPointerException
যদি নাম null
এবং ক্ষেত্রে default
যদি defaultValue
হয় null
। এভাবেই valueOfOrDefault
কাজ করে।
এই পদ্ধতিটি Map
ইন্টারফেসের নকশা গ্রহণ করে যা Map.getOrDefault(Object key, V defaultValue)
জাভা 8 হিসাবে একটি পদ্ধতি সরবরাহ করে ।
বিপরীত উপায়ে ক্যাপচার করা অন্য ইউটিলিটি। একটি মান ব্যবহার করে যা সনাক্ত করে যে এনুম, তার নাম থেকে নয়।
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.EnumSet;
public class EnumUtil {
/**
* Returns the <code>Enum</code> of type <code>enumType</code> whose a
* public method return value of this Enum is
* equal to <code>valor</code>.<br/>
* Such method should be unique public, not final and static method
* declared in Enum.
* In case of more than one method in match those conditions
* its first one will be chosen.
*
* @param enumType
* @param value
* @return
*/
public static <E extends Enum<E>> E from(Class<E> enumType, Object value) {
String methodName = getMethodIdentifier(enumType);
return from(enumType, value, methodName);
}
/**
* Returns the <code>Enum</code> of type <code>enumType</code> whose
* public method <code>methodName</code> return is
* equal to <code>value</code>.<br/>
*
* @param enumType
* @param value
* @param methodName
* @return
*/
public static <E extends Enum<E>> E from(Class<E> enumType, Object value, String methodName) {
EnumSet<E> enumSet = EnumSet.allOf(enumType);
for (E en : enumSet) {
try {
String invoke = enumType.getMethod(methodName).invoke(en).toString();
if (invoke.equals(value.toString())) {
return en;
}
} catch (Exception e) {
return null;
}
}
return null;
}
private static String getMethodIdentifier(Class<?> enumType) {
Method[] methods = enumType.getDeclaredMethods();
String name = null;
for (Method method : methods) {
int mod = method.getModifiers();
if (Modifier.isPublic(mod) && !Modifier.isStatic(mod) && !Modifier.isFinal(mod)) {
name = method.getName();
break;
}
}
return name;
}
}
উদাহরণ:
public enum Foo {
ONE("eins"), TWO("zwei"), THREE("drei");
private String value;
private Foo(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
EnumUtil.from(Foo.class, "drei")
ফিরে আসে Foo.THREE
, কারণ এটি getValue
"ড্রেই" মেলে ব্যবহার করবে , যা অনন্য পাবলিক, চূড়ান্ত নয় এবং ফু-তে স্থির পদ্ধতি নয়। যদি foo বিন্যাস, প্রকাশ্য চূড়ান্ত নয় এবং স্ট্যাটিক না পদ্ধতি, উদাহরণস্বরূপ, চেয়ে আরো আছে getTranslate
যা আয় "ড্রাই", অন্যান্য পদ্ধতি ব্যবহার করা যেতে পারে: EnumUtil.from(Foo.class, "drei", "getTranslate")
।
একটি এক্সটেনশন তৈরি করুন এবং তারপরে কল করুন valueOf<MyEnum>("value")
। যদি টাইপটি অবৈধ হয়, আপনি শূন্য হয়ে যাবেন এবং এটি পরিচালনা করতে হবে
inline fun <reified T : Enum<T>> valueOf(type: String): T? {
return try {
java.lang.Enum.valueOf(T::class.java, type)
} catch (e: Exception) {
null
}
}
বিকল্পভাবে, আপনি একটি ডিফল্ট মান সেট করতে পারেন, কল করা valueOf<MyEnum>("value", MyEnum.FALLBACK)
এবং নাল প্রতিক্রিয়া এড়ানো। ডিফল্ট স্বয়ংক্রিয় হওয়ার জন্য আপনি আপনার নির্দিষ্ট এনাম প্রসারিত করতে পারেন
inline fun <reified T : Enum<T>> valueOf(type: String, default: T): T {
return try {
java.lang.Enum.valueOf(T::class.java, type)
} catch (e: Exception) {
default
}
}
অথবা যদি আপনি উভয়ই চান তবে দ্বিতীয়টি তৈরি করুন:
inline fun <reified T : Enum<T>> valueOf(type: String, default: T): T = valueOf<T>(type) ?: default
আমি এই ধরণের প্রক্রিয়াটি কমান্ডগুলিকে গণনার ক্ষেত্রে স্ট্রিং হিসাবে পার্স করতে ব্যবহার করতে চাই। আমার কাছে সাধারণত "অজানা" হিসাবে একটি গণনা থাকে সুতরাং অন্যরা যখন খুঁজে পাওয়া যায় না তখন এটি ফিরে আসতে সহায়তা করে (এমনকি কোনও ক্ষেত্রে সংবেদনশীলতার ভিত্তিতে) শূন্যের পরিবর্তে (যার কোনও মূল্য নেই)। সুতরাং আমি এই পদ্ধতির ব্যবহার।
static <E extends Enum<E>> Enum getEnumValue(String what, Class<E> enumClass) {
Enum<E> unknown=null;
for (Enum<E> enumVal: enumClass.getEnumConstants()) {
if (what.compareToIgnoreCase(enumVal.name()) == 0) {
return enumVal;
}
if (enumVal.name().compareToIgnoreCase("unknown") == 0) {
unknown=enumVal;
}
}
return unknown;
}
এনামের নাম নেওয়ার দ্রুততম উপায় হ'ল অ্যাপ্লিকেশন শুরু হওয়ার সাথে সাথে এনাম টেক্সট এবং মানটির একটি মানচিত্র তৈরি করা এবং নামটি বেলাহ।
public enum Blah {
A("text1"),
B("text2"),
C("text3"),
D("text4");
private String text;
private HashMap<String, String> map;
Blah(String text) {
this.text = text;
}
public String getText() {
return this.text;
}
static{
createMapOfTextAndName();
}
public static void createMapOfTextAndName() {
map = new HashMap<String, String>();
for (Blah b : Blah.values()) {
map.put(b.getText(),b.name());
}
}
public static String getEnumName(String text) {
return map.get(text.toLowerCase());
}
}
Blah.valueOf("A")
পদ্ধতিটি কেস সংবেদনশীল এবং বহিরাগত সাদা স্থান সহ্য করে না, এইভাবে @ জোসমি'র নীচে প্রস্তাবিত বিকল্প সমাধান al