Sebelumnya, saya memiliki enum LegNo saya yang didefinisikan hanya sebagai:
NO_LEG, LEG_ONE, LEG_TWO
dan dengan menelepon return LegNo.values()[i];
, saya bisa mendapatkan nilai yang terkait dengan setiap enum.
Tapi sekarang saya telah memutuskan saya ingin LegNo
enum NO_LEG
menjadi int -1 daripada 0 jadi saya memutuskan untuk menggunakan konstruktor pribadi untuk menginisialisasi dan mengatur nilai intnya
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private LegNo(final int leg) { legNo = leg; }
satu-satunya hal sekarang adalah karena saya melakukannya dengan cara ini, values()
metode tersebut tidak akan berfungsi untuk NO_LEG
enum. Bagaimana cara mendapatkan enum yang terkait dengan int? Apakah ada cara yang efisien untuk melakukan ini selain menggunakan pernyataan case switch atau if-elseif-elseif
Saya dapat melihat banyak pertanyaan SO yang harus dilakukan dengan mendapatkan nilai int dari enum, tapi saya mengejar sebaliknya.
LegNo foo = LegNo.valueOf(2);
. Kode sebelumnya akan mengembalikan fileLegNo.LEG_TWO
.null
, seperti yang diharapkan dengan menggunakan HashMap.get : Mengembalikan nilai yang dipetakan kunci tertentu, atau null jika peta ini tidak berisi pemetaan untuk kunci tersebut.valueOf()
menggunakan enum 1000 anggota di dalam loop lain.Anda juga bisa menyertakan metode statis dalam enum yang mengulangi semua anggota dan mengembalikan yang benar.
public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private int legIndex; private LegNo(int legIndex) { this.legIndex = legIndex; } public static LegNo getLeg(int legIndex) { for (LegNo l : LegNo.values()) { if (l.legIndex == legIndex) return l; } throw new IllegalArgumentException("Leg not found. Amputated?"); } }
Sekarang, jika Anda ingin mendapatkan nilai Enum dengan integer, Anda cukup menggunakan:
int myLegIndex = 1; //expected : LEG_ONE LegNo myLeg = LegNo.getLeg(myLegIndex);
sumber
jawaban adarshr disesuaikan dengan Java 8:
import static java.util.Arrays.stream; import static java.util.stream.Collectors.toMap; import java.util.Map; public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private final int legNo; private final static Map<Integer, LegNo> map = stream(LegNo.values()).collect(toMap(leg -> leg.legNo, leg -> leg)); private LegNo(final int leg) { legNo = leg; } public static LegNo valueOf(int legNo) { return map.get(legNo); } }
sumber
Anda juga dapat mengakses nilai Enum yang sesuai dengan nilai integer yang diberikan hanya dengan memanggil metode values () pada enum LegNo. Ini mengembalikan bidang enum LegNo:
LegNo.values()[0]; //returns LEG_NO LegNo.values()[1]; //returns LEG_ONE LegNo.values()[2]; //returns LEG_TWO
Bukan persis hal yang dia cari, tetapi cukup dekat dan sangat sederhana. (Meskipun subjek sudah mati, ini mungkin berguna untuk orang lain.)
sumber
Cara Java 8 dengan nilai default:
public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private final int legNo; LegNo(int legNo) { this.legNo = legNo; } public static LegNo find(int legNo, Supplier<? extends LegNo> byDef) { return Arrays.asList(LegNo.values()).stream() .filter(e -> e.legNo == legNo).findFirst().orElseGet(byDef); } }
memanggil:
LegNo res = LegNo.find(0, () -> LegNo.NO_LEG);
atau dengan Pengecualian:
LegNo res = LegNo.find(0, () -> { throw new RuntimeException("No found"); });
sumber
public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private final int code; LegNo(int code) { this.code = code; ReverseStorage.reverseMap.put(code, this); } public static Optional<LegNo> getByCode(int code) { return Optional.ofNullable(ReverseStorage.reverseMap.get(code)); } private static final class ReverseStorage { private static final Map<Integer, LegNo> reverseMap = new LinkedHashMap<>(); } }
sumber
Karena enum Anda hanya berisi 3 elemen, cara tercepat adalah menggunakan serangkaian
if else
, seperti yang Anda sarankan.edit: jawaban yang diberikan adarshr lebih cocok untuk kasus umum, di mana ada banyak nilai enum, tapi saya pikir itu berlebihan untuk masalah Anda.
sumber
Map
kode di kode Anda tentu tidak berlebihan. Selain itu membuat metode ini jauh lebih bersih daripada spageti dengan kondisi lain.public LegNo valueOf(int value)
tidak boleh diubah. If-else kemudian bisa ditulis di dalam enum itu sendiri. Jika if-else keluar dari enum, maka itu pasti menjadi kode yang tidak terlalu bersih.public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private int legNo; private LegNo(int leg) { legNo = leg; } public static LegNo valueOf(int legNo) { for (LegNo leg : LegNo.values()) { if (leg.legNo == legNo) return leg; } } } assert LegNo.valueOf(2) == LegNo.LEG_TWO assert LegNo.valueOf(3) == null
sumber