Кажется, что стоимость, которую вы видите, является стоимостью загрузки класса: при первом обращении кода к классу загрузчик классов загружает свой двоичный файл (файл .class) в память. Это единовременная стоимость, которая для большинства практических целей незначительна.
Кроме того:
Теперь, если я напишу ... внутри цикла в коде, я обнаружу, что при первом вызове кода возникают накладные расходы,
Как вы измерили эту стоимость? Практически невозможно измерить временные затраты на одну операцию. Вы можете измерить время, необходимое для выполнения проходов xM через цикл, а затем разделить, чтобы получить амортизированную стоимость. Однако измерить одну операцию сложно: возможно, вы получаете цикл сбора мусора, переключение контекста, связанного с потоком, и т. Д. Кроме того, JIT (Just In Time) компилятор не запускает первый раз при выполнении оператора, поэтому измерение одна операция обычно дает вам гораздо более высокую стоимость, чем амортизированная стоимость по сравнению с N операциями.
FWIW, я бы написал getLocs()
следующим образом:
public static MapLocation[] getLocs(Direction dir) {
return valueOf(dir.name()).locs;
}
В качестве альтернативы вы можете использовать замену перечисления SightSensor на переменную типа EnumMap:
EnumMap<Direction, MapLocation[]> map = new EnumMap(Direction.class);
map.put(Direction.NORTH, new MapLocation[] { new MapLocation(0, 1),
new MapLocation(0, 2),
new MapLocation(0, 3) });
map.put(Direction.NORTH, new MapLocation[] { new MapLocation(0, -1),
new MapLocation(0, -2),
new MapLocation(0, -3) });
Тогда getLocs()
звонки просто становятся map.get(dir)