ใช้ค่าจากการเรียกเมธอดบน Enum เป็นพารามิเตอร์คำอธิบายประกอบ

ฉันมี

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

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

    public String path() {
        return path;
    }
}

ฉันต้องการใช้ค่าของเส้นทางกับคำอธิบายประกอบในวิธี REST API ของฉัน

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

แต่คอมไพเลอร์ Java บ่น

ค่าแอตทริบิวต์จะต้องคงที่

มีวิธีแก้ไขปัญหานั้นใน java8 หรือไม่?

ฉันรู้ว่าฉันสามารถมีหนึ่ง enum ที่มีชื่อการดำเนินการและฟิลด์ String แบบคงที่พร้อมเส้นทาง (สตริงแบบคงที่สามารถใช้เป็นแอตทริบิวต์ในคำอธิบายประกอบ @Path) แต่ฉันไม่ชอบแนวทางนี้


person Bartosz Bilicki    schedule 08.08.2017    source แหล่งที่มา
comment
ค่าแอตทริบิวต์คำอธิบายประกอบต้องได้รับการประเมิน ณ เวลาคอมไพล์ ในขณะที่อินสแตนซ์ enum สามารถประเมินได้ ณ รันไทม์เท่านั้น   -  person Usagi Miyamoto    schedule 08.08.2017
comment
@UsagiMiyamoto ไม่ใช่ enum แต่เป็นวิธีการ Enum สามารถใช้เป็นพารามิเตอร์ของคำอธิบายประกอบได้   -  person ByeBye    schedule 08.08.2017
comment
ไม่สามารถประเมินอินสแตนซ์ได้ในขณะคอมไพล์ เนื่องจากการอ้างอิงถึงอินสแตนซ์เหล่านี้สร้างขึ้นเมื่อโหลดคลาส...   -  person Usagi Miyamoto    schedule 08.08.2017
comment
ฟิลด์สตริงคงที่จำนวนมากพร้อมเส้นทางคือหนทางที่จะไป   -  person Sergey Kalinichenko    schedule 08.08.2017
comment
BTW คุณกำลังพยายามทำอะไรให้สำเร็จด้วยสิ่งนี้?   -  person Usagi Miyamoto    schedule 08.08.2017
comment
ฉันต้องการใช้ enum พร้อมชื่อวิธีการในที่เดียวและเส้นทางในอีกที่หนึ่ง (การเรียกไคลเอนต์ในการทดสอบ คำอธิบายประกอบ @Path)   -  person Bartosz Bilicki    schedule 08.08.2017


คำตอบ (1)


คุณไม่สามารถใช้เมธอด enum ในพารามิเตอร์คำอธิบายประกอบได้ แต่คุณสามารถสร้างคลาสได้:

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;
        }
    }

}

จะไม่มีความซ้ำซ้อน และคุณยังคงสามารถใช้แจงนับของคุณเหมือนเดิม และ static String ตัวอักษรในคำอธิบายประกอบ

person ByeBye    schedule 08.08.2017
comment
OP เขียนว่าพวกเขาไม่ชอบวิธีการฟิลด์ static ภายใน enum... ทำไมคุณถึงคิดว่าพวกเขาต้องการมันแยกจากกัน class ซึ่งซ่อน enum ไว้ข้างในตัวมันเอง - person Usagi Miyamoto; 08.08.2017
comment
ไม่สมบูรณ์แบบ แต่ดูเหมือนว่าจะไม่มีตัวเลือกที่ดีกว่า ฉันไม่สามารถรับชื่อการดำเนินการเป็นการเรียกเมธอดบนแจงนับได้ ฉันต้องมีสตริงคงที่ อย่างน้อยตอนนี้ฉันก็เห็นว่ามีการใช้สตริงคงที่ทั้งหมด (ในการดำเนินการแจงนับ) - person Bartosz Bilicki; 08.08.2017
comment
@UsagiMiyamoto ฉันแค่จัดเตรียมวิธีการเชื่อมต่อ enum กับ static string ฟิลด์ ไม่มีทางที่ดีกว่า - person ByeBye; 08.08.2017