Как вы можете расширить 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, который хранит ту же ссылку, что и наша переменная. Когда метод завершает и, возможно, изменяет эту ссылку в держателе, переменная на стороне вызывающего абонента 'Значение s заменяется ссылкой на владельцас ценностью.

Это должно компилироваться в эквивалент этого

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

Где это может потерпеть неудачу или как вы можете улучшить это?

Ответы на вопрос(10)

Ваш ответ на вопрос