Как вы можете расширить Java, чтобы ввести передачу по ссылке?
Java передается по значению. Как вы могли бы изменить язык, чтобы ввести передачу по ссылке (или какое-то эквивалентное поведение)?
Взять например что-то вроде
public static void main(String[] args) {
String variable = "'previous String reference'";
passByReference(ref variable);
System.out.println(variable); // I want this to print 'new String reference'
}
public static void passByReference(ref String someString) {
someString = "'new String reference'";
}
который (безref
) компилируется в следующеебайткодом
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String 'previous String reference'
2: astore_1
3: aload_1
4: invokestatic #3 // Method passByReference:(Ljava/lang/String;)V
7: return
public static void passByReference(java.lang.String);
Code:
0: ldc #4 // String 'new String reference'
2: astore_0
3: return
Код на3:
загружает ссылку в стек из переменнойvariable
.
Одна возможность, которую я рассматриваю, состоит в том, чтобы компилятор определил метод, передаваемый по ссылке, возможно сref
и измените метод так, чтобы он принимал объект Holder, который хранит ту же ссылку, что и наша переменная. Когда метод завершает работу и, возможно, изменяет эту ссылку в держателе, переменная на стороне вызывающего абонента заменяется значением ссылки на держателя.
Это должно компилироваться в эквивалент этого
public static void main(String[] args) {
String variable = "'previous String reference'";
Holder holder = Holder.referenceOf(variable);
passByReference2(holder);
variable = (String) holder.getReference(); // I don't think this cast is necessary in bytecode
System.out.println(variable);
}
public static void passByReference(Holder someString) {
someString.setReference("'new String reference'");
}
гдеHolder
может быть что-то вроде
public class Holder {
Object reference;
private Holder (Object reference) {
this.reference = reference;
}
public Object getReference() {
return this.reference;
}
public void setReference(Object reference) {
this.reference = reference;
}
public static Holder referenceOf(Object reference) {
return new Holder(reference);
}
}
Где это может потерпеть неудачу или как вы можете улучшить это?