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.forResource(TestResources.TR1)
一樣的單個ResourceRetriever
?
在天真的實現中,每次調用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的地圖每枚舉ECSResource
例如其獨特的相應ResourceRetriever.forResource(this)
實例?
注意,有可能通過自己做這樣的事情,通過如下:
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);
}
}