2012-07-31 9 views
8

widzę to rozproszone w całej bazie kodu:Czy wartość odwzorowania powinna być zadeklarowana w stałej lub wyliczeniowej?

@RequestMapping(value = "myValue") 

wolałbym użyć czegoś takiego:

@RequestMapping(value = Constants.myValue) 

Wydaje się przełamać na sucho przy użyciu rzeczywistej wartości String ciągu @RequestMapping zamiast stała. Ale czy to jest dobre ćwiczenie kodu? Czy zamiast tego powinienem użyć wyliczenia? Być może będę musiał użyć Constants.myValue w innym miejscu w bazie kodu.

+0

Co masz na myśli przez „break sucho”? Czy to nie działa? czy możesz napisać do nas swoją klasę Constants? – jontro

+0

@jontro przez łamanie DRY Mam na myśli: wartość String może być używana w innych obszarach kodu, więc wartość powinna być przypisana do stałej lub wyliczenia. Nie mam klasy stałych, to jest moja propozycja –

+0

@ user470184, jeśli jest to tylko dla mapowań żądań, użycie intellij usuwa potrzebę tego, ponieważ indeksuje odwzorowania żądań i czyni je dostępnymi jako intelli-text w odpowiednich miejscach. – NimChimpsky

Odpowiedz

12

Czy zamiast tego należy użyć wyliczenia?

Nie możesz. Zmienne adnotacji muszą być stałymi w czasie kompilacji. Są to zarówno emulatory, jak i literały łańcuchowe, ale nie można utworzyć wyliczenia, które jest ciągiem, a @RequestMapping potrzebuje ciągu (a jeśli twój enum ma metodę zwracającą ciąg lub ciąg, to nie jest to stała czasu kompilacji). Ponieważ istnieje wiele rund przetwarzania komentarzy, działa, gdy stała jest w innej klasie.

Powiedziałem: tak, powiedziałbym, że używanie dedykowanej klasy stałych (być może kilku dla różnych typów stałych) jest dobrą praktyką, której używam, kiedy tylko mogę (i działa z adnotacjami, o ile stała) nie jest zdefiniowany wewnątrz tej samej jednostki kompilacji, która ma adnotację, a b) jest inicjowana w deklaracji (w przeciwieństwie do statycznego bloku inicjalizatora)).

Oto przykład:

Controller

@Controller @RequestMapping(value = Mappings.CUSTOMER_PAGE) 
public class CustomerPageController{ 
    // methods here 
} 

Stałe klasa

public static final class Mappings{ 
    private Mappings(){} 
    public static final String CUSTOMER_PAGE = "path/to/customer/page" 
    // more constants 
} 

A oto niektóre wersje, które nie będą działać:

a)

@Controller @RequestMapping(value = CUSTOMER_PAGE) 
public class CustomerPageController{ 
    private static final String CUSTOMER_PAGE = "path/to/customer/page"; 
} 

Nie zostanie skompilowany, ponieważ adnotacja odwołuje się do stałej wewnątrz klasy, którą adnotuje. To nie może działać, ponieważ podczas kompilacji adnotacje są przetwarzane w oddzielnej rundzie przed resztą kodu, podczas gdy klasa wymaga adnotacji, aby była już przetwarzana do kompilacji (tj. Istnieje zależność między adnotacją a stałą)

b)

public static final class Mappings{ 
    private Mappings(){} 
    public static final String CUSTOMER_PAGE; 
    static{ 
     CUSTOMER_PAGE = "path/to/customer/page" 
    } 

    // more constants 
} 

Chociaż jest to statyczne pole końcowy, to nie jest stała w czasie kompilacji, a więc nie może być stosowany jako parametr adnotacji

+0

@NimChimpsky to trywialne, patrz powyżej –

+0

Ah, ok, myślałem bezpośrednio z wyliczeniem. Można również utworzyć odwołanie do klasy odwzorowania enum – NimChimpsky

+1

działa to jednak: '@RequestMapping (MyController.PATH) public class MyController { chronione statyczne końcowe String PATH ="/some-path "; ... ' –

Powiązane problemy