문제

다음과 같은 수업이 있다고 가정 해 봅시다.

class ApplicationDefs{
public static final String configOption1 = "some option";
public static final String configOption2 = "some other option";
public static final String configOption3 = "yet another option";
}

내 응용 프로그램의 다른 클래스 중 다수 가이 옵션을 사용하고 있습니다. 이제 옵션 중 하나를 변경하고 컴파일 된 클래스 만 배포하고 싶습니다. 그러나이 분야가 소비자 클래스에 줄을 서면 이것이 불가능 해요?

컴파일 시간 상수의 라이닝을 비활성화 할 수있는 옵션이 있습니까?

도움이 되었습니까?

해결책

String.intern ()을 사용하여 원하는 효과를 얻을 수 있지만 많은 사람들이 이것에 대해 알지 못하기 때문에 코드를 주석해야합니다. 즉

public static final String configOption1 = "some option".intern();

이렇게하면 컴파일 타임이 인라인을 방지합니다. 컴파일러가 PERM에 배치하는 것과 동일한 문자열을 참조하기 때문에 여분의 것을 만들지 않습니다.

대안으로 항상 할 수 있습니다

public static final String configOption1 = "some option".toString();

그러나 이것은 컴파일 된 인스턴을 사용하지 않으며, 오래된 세대에 새로운 문자열을 만들 것입니다. 큰 큰 거래는 아니며 읽기가 더 쉬울 수 있습니다. 어느 쪽이든, 이것은 조금 이상하기 때문에 코드에 댓글을 달아야하고있는 일을 유지하는 사람들에게 알리십시오.

편집하다:이에 대한 자세한 내용은 JLS에 대한 참조를 제공하는 또 다른 SO 링크를 찾았습니다.문자열 리터럴에서 인턴 ()을 사용하는시기

다른 팁

아니요, JLS의 일부입니다. 두렵습니다. 이것은 Java Puzzlers에서 간단히 다루지 만 내 사본이 없습니다.

속성 파일에 이러한 상수를 정의하고 주기적으로로드하는 클래스를 갖는 것을 고려할 수 있습니다.

참조: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313

아니요.하지만 다음과 같은 정적 메소드 호출로 교체 할 수 있습니다.

class ApplicationDefs {

    public static String configOption1() { return "some option"; }

}

물론 아름답 지 않지만 요구 사항을 충족시킬 것입니다. :)

사실, 당신은 제거하십시오 final 예어 상수는 컴파일 타임 상수가 중지 된 다음 구성 작동합니다 당신이 원하는 것처럼.

그러나 이것이 실제로 어떤 종류의 구성을하려고하는 경우, 일부 클래스 파일의 상수보다 더 관리하기 쉬운 방법으로 이동해야한다고 강력하게 제안됩니다.

일정한 비 컴파일 시간 상수를 만들어 인라인을 억제 할 수 있습니다 ...

예를 들어, null 컴파일 타임 상수가 아닙니다. 비 컴파일 타임 상수와 관련된 모든 표현은 컴파일 시간 상수가 아니지만 Javac은 컴파일 장치 내에서 일정한 접힘을 수행 할 수 있습니다.

public static final String configOption1 = null!=null?"": "some option";

이러한 값이 감소해야한다고 말하는 것은 없습니다. 당신은 방금 일부를 선언하고 있습니다 public, static 회원. 다른 수업은이 회원의 값을 사용하고 있습니다. 인라인이 없습니다. 심지어 final 예어

이 아니라면 성능 이유, 일부 JVMS는 할 수 있습니다 인라인 다른 클래스에서 이러한 값. 이것은 최적화입니다. 최적화는 프로그램의 동작을 변경해서는 안됩니다. 따라서이 회원의 정의를 변경하면 JVM은 인라인 이전 값.

이것이 인라인을 끄는 방법이없는 이유입니다. JVM은 인라인이없고 문제가 없거나 상환 된 경우 JVM은 상영을 보장합니다.

이 클래스를 정적으로 가져 오면 어떻게되는지 잘 모르겠습니다. 나는 인라인이 수행된다고 생각하며, 당신이 언급 한 문제를 일으킬 수 있다고 생각합니다. 이 경우 기본적으로 정적 가져 오기를 삭제할 수 있으며 괜찮습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top