Yanıtlar:
Java kafa karıştırıcıdır, çünkü her şey değerden geçer . Bununla birlikte , referans tipi bir parametre için (yani, ilkel tipte bir parametre değil), değerin içinden geçen referansın kendisidir , bu nedenle referansla geçer gibi görünür (ve insanlar genellikle bunun olduğunu iddia eder). Aşağıdakilerle gösterildiği gibi durum böyle değildir:
Object o = "Hello";
mutate(o)
System.out.println(o);
private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o!
Hello
Konsola yazdırır . Yazdırmaya yukarıdaki kodu istiyorsa seçenekleri Goodbye
şunlardır açık göndermede kullanmak şöyle:
AtomicReference<Object> ref = new AtomicReference<Object>("Hello");
mutate(ref);
System.out.println(ref.get()); //Goodbye!
private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); }
Java'da referans ile parametreleri iletebilir miyim?
Hayır.
Neden ? Java'nın yöntemlere argüman iletmek için yalnızca bir modu vardır : değere göre.
Not:
İlkel için bunu anlamak kolaydır: değerin bir kopyasını alırsınız.
Tüm diğerleri için referansın bir kopyasını alırsınız ve buna değere göre geçiş de denir.
Hepsi bu resimde:
Java'da dil düzeyinde ref'ye benzer bir şey yoktur . Java'da sadece semantik değere göre geçiş vardır
Merak uğruna Java'da nesnelerinizi değiştirilebilir bir sınıfa sararak ref benzeri bir semantik uygulayabilirsiniz:
public class Ref<T> {
private T value;
public Ref(T value) {
this.value = value;
}
public T get() {
return value;
}
public void set(T anotherValue) {
value = anotherValue;
}
@Override
public String toString() {
return value.toString();
}
@Override
public boolean equals(Object obj) {
return value.equals(obj);
}
@Override
public int hashCode() {
return value.hashCode();
}
}
test durumu:
public void changeRef(Ref<String> ref) {
ref.set("bbb");
}
// ...
Ref<String> ref = new Ref<String>("aaa");
changeRef(ref);
System.out.println(ref); // prints "bbb"
AtomicReference
(ilkel olmayanlar için)? Veya AtomicSomething
(örneğin AtomicBoolean
:) ilkel için mi?
int
yerine Integer
, bool
yerine Boolean
ve benzeri? Yani, sarıcı sınıflar (sözdizimi için endişelenirseniz otomatik olarak açılır) çalışmaz mı?
"Java Programlama Dili" nde James Gosling'den:
"... Java'da tam olarak bir parametre geçirme modu var - değere göre geçiş - ve bu işleri basitleştirir."
The pronouncement of the language god should be declared the answer
Pek değil. Java'nın yaratıcısının ne düşündüğüne veya inandığına rağmen, mutlak cevap dil spesifikasyonundan bir alıntıdan gelir.
Yapabileceğini sanmıyorum. En iyi seçeneğiniz "ref tarafından" geçmek istediğiniz şeyi başka bir sınıf örneğine kapsüllemek ve (dış) sınıfın referansını (değere göre) geçirmek olabilir. Ne demek istediğimi anlarsan ...
yani yönteminiz, daha sonra arayan tarafından görülebilen iletilen nesnenin dahili durumunu değiştirir.
Başka bir seçenek bir dizi kullanmaktır, örneğin;
void method(SomeClass[] v) { v[0] = ...; }
ancak 1) dizi, yöntem çağrılmadan önce başlatılmalıdır, 2) yine de örneğin takas yöntemini bu şekilde uygulayamaz ... Bu şekilde JDK, örn java.util.concurrent.atomic.AtomicMarkableReference.get(boolean[])
.