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
과 같은 열거 형 인스턴스가 ResourceRetriever
인 ResourceRetriever.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);
}
}