Saya ingin mendeklarasikan Arah enum, yang memiliki metode yang mengembalikan arah berlawanan (berikut ini tidak benar secara sintaksis, yaitu, enum tidak dapat dipakai, tetapi itu menggambarkan maksud saya). Apakah ini mungkin di Jawa?
Ini kodenya:
public enum Direction {
NORTH(1),
SOUTH(-1),
EAST(-2),
WEST(2);
Direction(int code){
this.code=code;
}
protected int code;
public int getCode() {
return this.code;
}
static Direction getOppositeDirection(Direction d){
return new Direction(d.getCode() * -1);
}
}
java
enums
enumeration
Skyler
sumber
sumber
d.getCode() * -1
==-d.getCode()
Jawaban:
Bagi mereka yang terpikat di sini dengan judul: ya, Anda dapat menentukan metode Anda sendiri di enum Anda. Jika Anda bertanya-tanya bagaimana cara memanggil metode non-statis tersebut, Anda melakukannya dengan cara yang sama seperti dengan metode non-statis lainnya - Anda memanggilnya pada contoh tipe yang mendefinisikan atau mewarisi metode itu. Dalam kasus enum contoh seperti itu hanya
ENUM_CONSTANT
s.Jadi yang Anda butuhkan hanyalah
EnumType.ENUM_CONSTANT.methodName(arguments)
.Sekarang mari kita kembali ke masalah dari pertanyaan. Salah satu solusinya bisa jadi
Sekarang
Direction.NORTH.getOppositeDirection()
akan kembaliDirection.SOUTH
.Berikut adalah cara yang lebih "hacky" untuk mengilustrasikan komentar @jedwards tetapi tidak terasa sefleksibel pendekatan pertama karena menambahkan lebih banyak bidang atau mengubah urutannya akan merusak kode kita.
sumber
.values()[ordinal()]
peretasan tetapi pendekatan ini jauh lebih kuatDirection
kelas enum adalahNORTH
,EAST
,SOUTH
,WEST
sehingga Anda hanya dapat menggunakanNORTH.getOppositeDirection()
dan akan kembaliSOUTH
. " Apa nama teknik ini? " jika Anda bertanya tentangstatic{...}
itu maka itu adalah blok inisialisasi statis , itu adalah kode yang dipanggil ketika kelas dimuat pertama kali (ini adalah bagian dari proses yang sama yang menginisialisasi bidang statis).Untuk enum kecil seperti ini, saya menemukan solusi yang paling mudah dibaca:
sumber
Ini bekerja:
sumber
Buat metode abstrak, dan minta setiap nilai enumerasi Anda menimpanya. Karena Anda mengetahui kebalikannya saat Anda membuatnya, tidak perlu membuat atau membuatnya secara dinamis.
Itu tidak terbaca dengan baik; mungkin
switch
akan lebih mudah dikelola?sumber
Ya, kami melakukannya sepanjang waktu. Anda mengembalikan instance statis daripada Objek baru
sumber
Enum memiliki metode nilai statis yang mengembalikan larik yang berisi semua nilai enum sesuai urutan pernyataannya. sumber
karena UTARA mendapat 1, TIMUR mendapat 2, SELATAN mendapat 3, BARAT mendapat 4; Anda dapat membuat persamaan sederhana untuk mendapatkan persamaan sebaliknya:
(nilai + 2)% 4
sumber