Dalam ilmu komputer, indeks dimulai dari 0, bukan 1 ;-)
fredoverflow
1
Anda yakin mau? Umumnya Anda tidak boleh menyentuh ordinal, selain menerapkan struktur data tingkat rendah (lalu, gunakan mekanisme alternatif, seperti nama, untuk persistensi).
Tom Hawtin - tackline
Anda juga bisa menggunakan konstanta di kelas java.util.Calendar. Mereka diberi nomor 0 - 11 untuk Jan - Des. Berhati-hatilah dengan 12 karena itu adalah UnDecember (ada hubungannya dengan kalender lunar). Tapi saya hanya ingin tahu mengapa menciptakan kembali konstanta bulan yang sudah menjadi "stok" di JRE?
Chris Aldrich
2FredOverflow: Setuju, saya menggunakan pengindeksan yang salah. 2Tom Hawtin: Ya, saya yakin. Saya mempertahankan data dengan beberapa kerangka kerja dan saya mendapatkan kembali indeks integer, bukan enum. 2Chris Aldrich: Ini hanya contoh dummy yang tidak sesuai dengan kasus sebenarnya.
jk_
Omong-omong, Java 8 dan yang lebih baru hadir dengan Monthenum built-in.
Perhatikan itu akan mengkloning salinan larik nilai setiap kali, jadi jika Anda memanggil ini di loop dalam kode sensitif kinerja, Anda mungkin ingin membuat salinan statis dan menggunakannya.
Christopher Barber
1
Saya bingung, lalu mengapa saya tidak ingin menggunakan array?
Anudeep Samaiya
@AnudeepSamaiya mungkin kita ingin menggunakan konstanta enum yang tepat (Months.JAN) dalam kode daripada bulan [1] di mana-mana.
Harry Joy
@Christopher Barber inilah satu baris untuk "membuat salinan statis" public static final ArrayList<Months> ALL = new ArrayList<Month>() {{ for (Months m : Months.values()) add(m); }};Months i = ALL.get(index)
:,
Akan lebih mudah untuk hanya menggunakan Months.values (). Clone () atau jika Anda paranoid tentang mutabilitas untuk membungkusnya dalam daftar yang tidak dapat diubah (lihat Koleksi)
Kelas memiliki nilai sendiri yang disimpan di dalam array, dan saya menggunakan array untuk mendapatkan enum di indexposition. Seperti disebutkan di atas, array mulai dihitung dari 0, jika Anda ingin indeks Anda mulai dari '1' cukup ubah kedua metode ini menjadi:
Saya baru-baru ini mengalami masalah yang sama dan menggunakan solusi yang diberikan oleh Harry Joy. Solusi itu hanya bekerja dengan enumaration berbasis nol. Saya juga tidak akan menganggapnya aman karena tidak berurusan dengan indeks yang berada di luar jangkauan.
Solusi yang akhirnya saya gunakan mungkin tidak sesederhana itu tetapi sepenuhnya aman dan tidak akan merusak kinerja kode Anda bahkan dengan enum besar:
Jika Anda yakin bahwa Anda tidak akan pernah berada di luar jangkauan dengan indeks Anda dan Anda tidak ingin menggunakan UNKNOWNseperti yang saya lakukan di atas, Anda tentu saja dapat melakukannya:
Month
enum built-in.Jawaban:
Coba ini
sumber
public static final ArrayList<Months> ALL = new ArrayList<Month>() {{ for (Months m : Months.values()) add(m); }};
Months i = ALL.get(index)
Berikut tiga cara untuk melakukannya.
sumber
public static
bisa berubah (baik array dan non-final
). Euw. DanIllegalArgumentException
akan lebih masuk akal daripada mengembalikannull
bom.Saya baru saja mencoba hal yang sama dan menemukan solusi berikut:
Kelas memiliki nilai sendiri yang disimpan di dalam array, dan saya menggunakan array untuk mendapatkan enum di indexposition. Seperti disebutkan di atas, array mulai dihitung dari 0, jika Anda ingin indeks Anda mulai dari '1' cukup ubah kedua metode ini menjadi:
Di dalam Utama saya, saya mendapatkan objek negara yang dibutuhkan
yang menyetel currCountry ke negara terakhir, dalam hal ini Countries.KENTUCKY.
Ingat saja kode ini sangat dipengaruhi oleh ArrayOutOfBoundsExceptions jika Anda menggunakan indikasi hardcode untuk mendapatkan objek Anda.
sumber
Saya baru-baru ini mengalami masalah yang sama dan menggunakan solusi yang diberikan oleh Harry Joy. Solusi itu hanya bekerja dengan enumaration berbasis nol. Saya juga tidak akan menganggapnya aman karena tidak berurusan dengan indeks yang berada di luar jangkauan.
Solusi yang akhirnya saya gunakan mungkin tidak sesederhana itu tetapi sepenuhnya aman dan tidak akan merusak kinerja kode Anda bahkan dengan enum besar:
Jika Anda yakin bahwa Anda tidak akan pernah berada di luar jangkauan dengan indeks Anda dan Anda tidak ingin menggunakan
UNKNOWN
seperti yang saya lakukan di atas, Anda tentu saja dapat melakukannya:sumber