gunakan nilai dari pemanggilan metode di Enum sebagai parameter anotasi

Saya punya

enum Operations { 
 OPERATION_NAME("operation/path");    
    private final String path;

    Operations(String path) {
        this.path = path;
    }

    public String path() {
        return path;
    }
}

Saya ingin menggunakan nilai jalur pada anotasi pada metode REST API saya

  @Path(Operations.OPERATION_NAME.path())
  void operation() {
  }

tapi kompiler Java mengeluh

Nilai atribut harus konstan

Apakah ada cara untuk mengatasinya di Java8?

Saya tahu saya dapat memiliki satu enum dengan nama operasi dan sekumpulan bidang String statis dengan jalur (String statis dapat digunakan sebagai atribut dalam anotasi @Path) tetapi saya tidak menyukai pendekatan ini.


person Bartosz Bilicki    schedule 08.08.2017    source sumber
comment
Nilai atribut anotasi harus dievaluasi pada waktu kompilasi, sedangkan instance enum hanya dapat dievaluasi pada waktu proses.   -  person Usagi Miyamoto    schedule 08.08.2017
comment
@UsagiMiyamoto bukan enum tetapi metode. Enum dapat digunakan sebagai parameter anotasi   -  person ByeBye    schedule 08.08.2017
comment
Instance tidak dapat dievaluasi pada waktu kompilasi, karena referensinya dibuat saat pemuatan kelas...   -  person Usagi Miyamoto    schedule 08.08.2017
comment
Sekelompok bidang String statis dengan jalur adalah cara yang tepat.   -  person Sergey Kalinichenko    schedule 08.08.2017
comment
BTW Apa yang ingin Anda capai dengan ini?   -  person Usagi Miyamoto    schedule 08.08.2017
comment
Saya ingin menggunakan enum dengan nama metode di satu tempat, dan jalur di tempat lain (panggilan klien dalam pengujian, anotasi @Path).   -  person Bartosz Bilicki    schedule 08.08.2017


Jawaban (1)


Anda tidak dapat menggunakan metode enum dalam parameter anotasi, tetapi Anda dapat membuat kelas:

public final class Operations {

    private Operations() {};

    public static final String op1 = "operation/path";
    public static final String op2 = "operation2/path";

    public enum Enum { 

        OPERATION1(op1),
        OPERATION2(op2);

        private final String path;

        Enum(final String path) {
            this.path = path;
        }

        public final String path() {
            return path;
        }
    }

}

Tidak akan ada duplikasi, dan Anda masih dapat menggunakan enum Anda sama seperti sebelumnya, dan static String literal dalam anotasi

person ByeBye    schedule 08.08.2017
comment
OP menulis mereka tidak menyukai pendekatan bidang static di dalam enum... Menurut Anda mengapa mereka menyukainya di class terpisah, yaitu menyembunyikan enum di dalam dirinya sendiri? - person Usagi Miyamoto; 08.08.2017
comment
Tidak sempurna, tapi sepertinya ini bukan pilihan yang lebih baik. Saya tidak bisa mendapatkan nama operasi sebagai pemanggilan metode di enum. Saya harus memiliki String statis. Jadi sekarang, setidaknya saya melihat bahwa semua string statis digunakan (dalam operasi enum) - person Bartosz Bilicki; 08.08.2017
comment
@UsagiMiyamoto Saya hanya memberikan cara menghubungkan enum dengan bidang static string. Tidak ada cara yang lebih baik - person ByeBye; 08.08.2017