2014-11-05 2 views
10

JVM이 다음 시나리오에서 런타임 최적화를 수행 할 수 있습니까?런타임시 변경되지 않는 열거 메소드를 JVM에서 최적화 할 수 있습니까?

public interface ECSResource { 
    default int getFor(final Entity entity) { 
     return ResourceRetriever.forResource(this).getFor(entity); 
    } 
} 

그리고 구체적인 구현과 같은 :

private static enum TestResources implements ECSResource { 
    TR1, TR2; 
} 

는 JVM이 (실행시) 알아낼 수 있을까

우리는 다음과 같은 상황을 가지고, 우리는이 인터페이스를 가지고 TestResources.TR1과 같은 열거 형 인스턴스가 ResourceRetrieverResourceRetriever.forResource(TestResources.TR1)과 같은 하나에 속해 있습니까?

순진한 구현에서 TestResources.TR1.getFor(...)을 호출 할 때마다 ResourceRetriever 인스턴스가 새로 생성됩니다. 하지만이 경우

은, 우리가 (코드 검사) ResourceRetriever.forResource(this)에 대한 호출은 다음 호출 할 것이라는 점을 알고있다 :

public class ResourceRetriever { 
    private final ECSResource resource; 

    ResourceRetriever(ECSResource resource) { 
     this.resource = resource; 
    } 

    public static ResourceRetriever forResource(ECSResource resource) { 
     return new ResourceRetriever(resource); 
    } 

    //lots of methods 
} 

따라서 오류를 반올림으로 인해 임의의 결과를 런타임에 변경할 수 있습니다 아무것도 없다, 등

따라서 질문 : 수있는 JVM지도 독특한 해당 ResourceRetriever.forResource(this) 인스턴스에 대한 모든 열거ECSResource 예? 다음을 통해, 자신에 의해 그런 일을 할 수

참고 : new 키워드

private static enum TestResources implements ECSResource { 
    TR1, TR2; 

    private static final Map<TestResources, ResourceRetriever> retrieverMapping; 
    static { 
     retrieverMapping = Arrays.stream(TestResources.values()) 
      .collect(Collectors.toMap(res -> res, ResourceRetriever::forResource)); 
    } 

    @Override 
    public int getFor(final Entity entity) { 
     return retrieverMapping.get(this).getFor(entity); 
    } 
} 

답변

2

의미는 거의 확실하게 당신이하고자하는지 금지합니다. (The Java Language SpecificationThe Java Virtual Machine Specification의 참조를 참조하십시오.) forResource 메서드는 항상 새 개체를 반환합니다. 임의의 주어진 ECSResource에 대해 하나의 ResourceRetriever 만 만들어야한다는 것을 결정하는 메커니즘이 없다는 것을 감안할 때, 수행하려는 JVM을 모릅니다. 이것은 내게 memoization의 형태로 보입니다.이 형식은 런타임 (JVM)이 아닌 언어 (예 : Groovy, 특별히 이에 대한 주석이 있음)로 처리됩니다. Java가 제네릭을 구체화했다면, ResourceRetriever<? extends ECSResource>과 같은 기능을 사용하여 해킹 할 수는 있지만 실제로 작동하는지 여부는 알 수 없습니다.

관련 문제