জাভাতে আমার একটি এনাম রয়েছে:
public enum Months
{
JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
}
আমি সূচী দ্বারা এনাম মানগুলি অ্যাক্সেস করতে চাই eg
Months(1) = JAN;
Months(2) = FEB;
...
কীভাবে করব?
জাভাতে আমার একটি এনাম রয়েছে:
public enum Months
{
JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
}
আমি সূচী দ্বারা এনাম মানগুলি অ্যাক্সেস করতে চাই eg
Months(1) = JAN;
Months(2) = FEB;
...
কীভাবে করব?
Monthঅন্তর্নির্মিত একটি এনামের সাথে আসে ।
উত্তর:
এটা চেষ্টা কর
Months.values()[index]
public static final ArrayList<Months> ALL = new ArrayList<Month>() {{ for (Months m : Months.values()) add(m); }};তারপরে আপনি উপাদানগুলি অ্যাক্সেস করতে পারবেনMonths i = ALL.get(index)
এটি করার জন্য এখানে তিনটি উপায়।
public enum Months {
JAN(1), FEB(2), MAR(3), APR(4), MAY(5), JUN(6), JUL(7), AUG(8), SEP(9), OCT(10), NOV(11), DEC(12);
int monthOrdinal = 0;
Months(int ord) {
this.monthOrdinal = ord;
}
public static Months byOrdinal2ndWay(int ord) {
return Months.values()[ord-1]; // less safe
}
public static Months byOrdinal(int ord) {
for (Months m : Months.values()) {
if (m.monthOrdinal == ord) {
return m;
}
}
return null;
}
public static Months[] MONTHS_INDEXED = new Months[] { null, JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
}
import static junit.framework.Assert.assertEquals;
import org.junit.Test;
public class MonthsTest {
@Test
public void test_indexed_access() {
assertEquals(Months.MONTHS_INDEXED[1], Months.JAN);
assertEquals(Months.MONTHS_INDEXED[2], Months.FEB);
assertEquals(Months.byOrdinal(1), Months.JAN);
assertEquals(Months.byOrdinal(2), Months.FEB);
assertEquals(Months.byOrdinal2ndWay(1), Months.JAN);
assertEquals(Months.byOrdinal2ndWay(2), Months.FEB);
}
}
public staticপরিবর্তনীয় (উভয় অ্যারে এবং অ- final) ইওউ। এবং IllegalArgumentExceptionএকটি nullবোমা ফিরিয়ে দেওয়ার চেয়ে অনেক বেশি অর্থবোধ করতে পারে ।
আমি ঠিক একই চেষ্টা করেছি এবং নিম্নলিখিত সমাধান নিয়ে এসেছি:
public enum Countries {
TEXAS,
FLORIDA,
OKLAHOMA,
KENTUCKY;
private static Countries[] list = Countries.values();
public static Countries getCountry(int i) {
return list[i];
}
public static int listGetLastIndex() {
return list.length - 1;
}
}
শ্রেণীর নিজস্ব অ্যারেগুলির মধ্যে নিজস্ব মানগুলি সংরক্ষণ করা হয় এবং আমি সূচীটিতে এনাম পেতে অ্যারেটি ব্যবহার করি। উপরে উল্লিখিত অ্যারেগুলি 0 থেকে গণনা শুরু হয়, আপনি যদি সূচি '1' থেকে শুরু করতে চান তবে কেবল এই দুটি পদ্ধতিতে এই পরিবর্তন করুন:
public static String getCountry(int i) {
return list[(i - 1)];
}
public static int listGetLastIndex() {
return list.length;
}
আমার মেইনের অভ্যন্তরে আমি প্রয়োজনীয় দেশগুলির সাথে আপত্তি জানাই
public static void main(String[] args) {
int i = Countries.listGetLastIndex();
Countries currCountry = Countries.getCountry(i);
}
এই ক্ষেত্রে, দেশগুলি.কেনটুকি।
কেবল মনে রাখবেন এই কোডটি অ্যারেআউটআউটফাউন্ডস এক্সেক্সসেশন দ্বারা খুব প্রভাবিত হয় যদি আপনি নিজের অবজেক্টগুলি পাওয়ার জন্য হার্ডকোডযুক্ত সূচকগুলি ব্যবহার করেন।
আমি সম্প্রতি একই সমস্যা পেয়েছি এবং হ্যারি জয়ের সরবরাহিত সমাধানটি ব্যবহার করেছি। এই সমাধানটি যদিও কেবল শূন্য-ভিত্তিক এনামুলেশন দিয়ে কাজ করে। আমি এটিকে সংরক্ষণ হিসাবে বিবেচনা করব না কারণ এটি সীমার বাইরে থাকা সূচিগুলির সাথে ডিল করে না।
আমি যে সমাধানটি ব্যবহার করে শেষ করেছি তা এত সহজ নাও হতে পারে তবে এটি সম্পূর্ণরূপে সংরক্ষণ করে এবং আপনার কোডের কার্যকারিতা বড় এনামগুলির সাথেও আঘাত করবে না:
public enum Example {
UNKNOWN(0, "unknown"), ENUM1(1, "enum1"), ENUM2(2, "enum2"), ENUM3(3, "enum3");
private static HashMap<Integer, Example> enumById = new HashMap<>();
static {
Arrays.stream(values()).forEach(e -> enumById.put(e.getId(), e));
}
public static Example getById(int id) {
return enumById.getOrDefault(id, UNKNOWN);
}
private int id;
private String description;
private Example(int id, String description) {
this.id = id;
this.description= description;
}
public String getDescription() {
return description;
}
public int getId() {
return id;
}
}
আপনি যদি নিশ্চিত হন যে আপনি কখনই আপনার সূচকের সাথে সীমার বাইরে থাকবেন না এবং আপনি UNKNOWNউপরের মতো করে ব্যবহার করতে চান না তবে অবশ্যই আপনি করতে পারেন:
public static Example getById(int id) {
return enumById.get(id);
}