Java передает аргументы и возвращаемые значения «по значению», что означает, что C++ - ссылки типа не поддерживаются. По дизайну, нет способа сказать компилятору «не копировать переменную a
, вместо этого сделать alias, и пусть другая функция использует ту же ячейку памяти и модифицирует мою переменную, если захочет».
Обходной путь заключается в том, чтобы вместо этого передать ссылку на объект-обертку. Для массивов объект-оболочка сохранит ссылку на массив и смещение. Вот способ, используя встроенные классы:
IntBuffer get(int[] array, int index)
{
return IntBuffer.wrap(array, index, 1).slice();
}
get(array, 5).put(42);
И еще (который не работает для примитивных типов):
List<Object> get(Object[] array, int index)
{
return Arrays.asList(array).subList(offset, offset + 1);
}
get(array, 5).set(0, new Object());
Это должно быть так же быстро, как прямой доступ к массиву, потому что JIT знает, как оптимизировать весь код котельной.
Но поскольку Java не позволяет вам переопределить оператор =
, синтаксис не так хорош, как хотелось бы.
Почему бы просто не использовать 'array [index] = 5' без какой-либо функции между ними? Я не понимаю, как вы пытаетесь добиться такого увеличения производительности. – noone
@noone Цель состоит в том, чтобы ** инкапсулировать логику индексирования массива **, а * поддерживать * хорошую производительность. –
@AleksandrDubinsky, если ваша точка заключается в инкапсуляции логики индексирования массива, то одним из способов было бы написать вспомогательный класс с помощью метода типа setValue (int [] array, int customIndex, int newValue). Каждое решение для массива, использующего примитивные типы, будет связано с этим способом. –