Java est passé par valeur. Comment pourriez-vous modifier la langue d'introduire le passage par référence (ou l'équivalent comportement)?
Prenez par exemple quelque chose comme
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'";
}
qui (sans le ref
) compile à la suite de bytecode
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
Le code lors de l' 3:
des charges de la référence dans la pile de la variable variable
.
Une possibilité que j'envisage est d'avoir le compilateur de déterminer une méthode est de passer par référence, éventuellement avec ref
, et de modifier la méthode d'accepter un Détenteur de l'objet qui stocke la même référence que notre variable. Lorsque la méthode est terminée, et, éventuellement, des changements qui font référence dans le support, la variable sur l'appelant côté de la valeur est remplacée par le titulaire de référence de la valeur.
Il doit compiler pour un équivalent de ce
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'");
}
où Holder
pourrait être quelque chose comme
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);
}
}
Où cela peut-il échouer ou comment pourriez-vous améliorer?