2016-09-27 11 views
0

한 프로젝트에서 상수 (정적 최종, 컴파일 타임에 초기화 됨)가 선언되면 컴파일시 다른 프로젝트의 참조가 리터럴로 바뀌는 것을 발견했습니다. 컴파일시 리터럴로 상수 참조 교체 피하기

그것은이를 방지하고 참조가 할 수있는 유일한 방법을 보인다

는 리터럴 (인터페이스에 반대되는) 클래스에 상수를 선언하는 것보다는 상수 필드를 참조하고 예 : "최종"생략 :

public class MyClass { 
    public static String MY_CONSTANT = "The constant value"; 
} 

불행히도 저는 이것을 이해하기 전에 상수로 가득 찬 인터페이스를 코딩했습니다. 이제는 상수를 변경하기 위해이를 참조하는 모든 프로젝트를 식별하고 다시 컴파일해야합니다. 나는 무언가가 빠져 나올까 봐 걱정합니다.

또한 "final"수정자가없는 상수는 정확히 상수가 아닙니다.

리터럴에 의한 상수 참조의 대체를 억제 할 수있는 컴파일 옵션이 있습니까?

+0

Java에 대한 지식이있는 구멍을 발견했습니다. 그리고 기록을 위해 : 그렇습니다, 이것은 어떻게 든 더 큰 설정에서 문제입니다, ** 그러나 ** 이것은 잘 알려진 문제입니다. 어떤 합리적인 ** 빌드 시스템 **도이를 처리 할 수 ​​있어야합니다. ** ** 의존성을 이해하고 필요가있는 모든 수업을 다시 컴파일해야하는 필요성에 의해 ... – GhostCat

+0

우리는 오래 전에 그렇게 똑같은 실수를 했었습니다. 우리는 getter-Methods를 사용하기 위해 인터페이스를 변경했습니다. 및 구현 클래스. Joshua Bloch의 "Effective Java"를 추가하십시오. 항목 19 : "유형을 정의하는 데만 인터페이스 사용" –

답변

1

그냥 compile-time constant expression이 아닌 것을 필요로합니다. 예를 들어, 메소드 호출은 그렇지 않습니다. 그래서 각 리터럴의 끝에 .intern()을 추가하면 규칙에서 벗어날 수 있습니다. 그런 다음 각 참조 사이트는 대상 유형이 초기화되었는지 확인하고 현재 값을 읽어야합니다.

이 동작을 변경하는 컴파일러 옵션은 Java 언어 사양을 위반하므로 불가능합니다.