gpt4 book ai didi

java - 如何扩展 Java 以引入引用传递?

转载 作者:IT老高 更新时间:2023-10-28 21:14:11 26 4
gpt4 key购买 nike

Java is pass-by-value.您如何修改语言以引入按引用传递(或某些等效行为)?

举个例子

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)编译为以下 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

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);
}
}

这可能在哪里失败,或者您如何改进它?

最佳答案

我在 Java 中看到的按引用传递的惯用语是传递一个单元素数组,它既可以保持运行时类型安全(与经历删除的泛型不同),又可以避免引入一个新的类。

public static void main(String[] args) {
String[] holder = new String[1];

// variable optimized away as holder[0]
holder[0] = "'previous String reference'";

passByReference(holder);
System.out.println(holder[0]);
}

public static void passByReference(String[] someString) {
someString[0] = "'new String reference'";
}

关于java - 如何扩展 Java 以引入引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21274346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com