복붙노트

[SPRING] 상수 또는 열거 형으로 매핑 값을 선언해야합니까?

SPRING

상수 또는 열거 형으로 매핑 값을 선언해야합니까?

코드베이스 전체에 흩어져있는 것을 볼 수 있습니다.

@RequestMapping(value = "myValue")

나는 이런 식으로 사용하는 것을 선호한다 :

@RequestMapping(value = Constants.myValue)

상수 대신 @RequestMapping 내에서 실제 String 값을 사용하여 DRY를 중단하는 것으로 보입니다. 하지만이 좋은 코드 연습은 무엇입니까? 대신 enum을 사용해야합니까? 코드베이스의 다른 곳에서 Constants.myValue를 사용해야 할 수도 있습니다.

해결법

  1. ==============================

    1.당신은 할 수 없습니다. 주석 변수는 컴파일 타임 상수 여야합니다. 열거 형과 문자열 리터럴 모두 있지만 문자열 인 열거 형을 만들 수는 없으며 @RequestMapping에는 String이 필요합니다. 열거 형에 String 또는 String 필드를 반환하는 메서드가 있으면 컴파일 타임 상수가 아닙니다. . 어노테이션 처리는 여러 라운드가 있기 때문에 상수가 다른 클래스에있을 때 작동합니다.

    당신은 할 수 없습니다. 주석 변수는 컴파일 타임 상수 여야합니다. 열거 형과 문자열 리터럴 모두 있지만 문자열 인 열거 형을 만들 수는 없으며 @RequestMapping에는 String이 필요합니다. 열거 형에 String 또는 String 필드를 반환하는 메서드가 있으면 컴파일 타임 상수가 아닙니다. . 어노테이션 처리는 여러 라운드가 있기 때문에 상수가 다른 클래스에있을 때 작동합니다.

    즉 : 전용 상수 클래스 (아마도 상수의 여러 유형에 대해 여러 가지)를 사용할 때마다 사용할 수있는 좋은 방법이라고 할 수 있습니다 (상수가 a 인 경우 주석이 작동하는 한 정의되지 않음). 주석을 가지고있는 같은 컴파일 유닛 내부에 있고 b) 선언문에서 초기화되어있다. (정적 이니셜 라이저 블록과는 반대로).

    다음은 그 예입니다.

    제어 장치

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

    상수 클래스

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

    다음은 작동하지 않는 버전입니다.

    에이)

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

    주석은 주석을 달아주는 클래스 내부의 상수를 참조하기 때문에 컴파일되지 않습니다. 컴파일하는 동안 주석이 나머지 코드보다 먼저 별도의 라운드에서 처리되기 때문에 클래스가 주석 처리를 위해 이미 처리해야하는 주석 (즉, 주석과 상수 사이의 cicular 종속성)이 필요하기 때문에 컴파일 할 수 없습니다.

    비)

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

    이것은 정적 최종 필드이지만 컴파일시 상수가 아니므로 주석 매개 변수로 사용할 수 없습니다

  2. from https://stackoverflow.com/questions/11741010/should-mapping-value-be-declared-in-a-constant-or-as-an-enum by cc-by-sa and MIT license