В языках со ссылками, такими как C, C ++, C #, PHP, Perl и т. Д., Вы можете передать указатель или ссылку на значение функции и изменить его на месте:
#include <stdio.h>
void doit(int *ptr_to_n) {
*ptr_to_n = 42; // modifies the value pointed to by ptr_to_n by a dereference
}
int main(void) {
int n = 415;
doit(&n);
printf(" %d\n", n); // => 42
return 0;
}
Javaстрого передается по значению и не содержит указателей или адресов операторов.Код, который вы представили здесь, использует массив для преодоления этого ограничения.В приведенном ниже коде ссылка на массив в вызывающей области копируется и передается по значению в res
, но res
по-прежнему указывает на тот же базовый объект, что и arr
, поэтому сам массив не копируется, толькоaliased.
class Main {
public static void main(String[] args) {
int n = 415;
int[] arr = {415};
doit(n);
doitPointer(arr);
System.out.println("Copy primitive: " + n);
System.out.println("Copy reference to object: " + arr[0]);
}
static void doit(int n) {
n = 42; // assignment to local variable which will be unavailable in outer scope
}
static void doitPointer(int[] res) {
res[0] = 42; // assignment to element in referenced array, available in outer scope
}
}
Вывод:
Copy primitive: 415
Copy reference to object: 42
В конкурентном программировании это полезный и приемлемый метод, который может упростить логику, но обычно это ленивая практика в производственных условиях, потому что этонарушает инкапсуляцию, делает код трудным для рассуждения и имеет семантическую стоимость.
Используйте класс для инкапсуляции значения, поместите функции в область видимости, чтобы они могли модифицировать закрытые члены класса, или переписали логику вИзбегайте необходимости ссылок.