Имитация ссылки с обертками.
Один из способов имитировать это поведение - создать универсальную оболочку.
public class _<E> {
E ref;
public _( E e ){
ref = e;
}
public E g() { return ref; }
public void s( E e ){ this.ref = e; }
public String toString() {
return ref.toString();
}
}
Я не слишком убежден в ценности этого кода, потому что я ничего не мог с этим поделать, мне пришлось его кодировать :)
Итак, вот оно.
Пример использования:
public class Test {
public static void main ( String [] args ) {
_<Integer> iByRef = new _<Integer>( 1 );
addOne( iByRef );
System.out.println( iByRef ); // prints 2
_<String> sByRef = new _<String>( "Hola" );
reverse( sByRef );
System.out.println( sByRef ); // prints aloH
}
// Change the value of ref by adding 1
public static void addOne( _<Integer> ref ) {
int i = ref.g();
ref.s( ++i );
// or
//int i = ref.g();
//ref.s( i + 1 );
}
// Reverse the vale of a string.
public static void reverse( _<String> otherRef ) {
String v = otherRef.g();
String reversed = new StringBuilder( v ).reverse().toString();
otherRef.s( reversed );
}
}
Забавно, что общее имя класса-обертки - "_", которое является допустимым идентификатором класса. Итак, объявление гласит:
Для целого числа:
_<Integer> iByRef = new _<Integer>( 1 );
Для строки:
_<String> sByRef = new _<String>( "Hola" );
Для любого другого класса
_<Employee> employee = new _<Employee>( Employee.byId(123) );
Методы "s" и "g" означают set и get: P