回答:
すべてが値で渡されるため、Javaは混乱しています。ただし、参照型のパラメーター(プリミティブ型のパラメーターではない)の場合、値によって渡されるのは参照自体であるため、参照渡しであるように見えます(多くの場合、それはそうであると主張します)。次のように、これは当てはまりません。
Object o = "Hello";
mutate(o)
System.out.println(o);
private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o!
印刷されますHello
コンソールに。上記のコードを印刷する場合のオプションは、次のように明示的な参照Goodbye
を使用することです。
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では、言語レベルでrefに似たものはありません。Javaではセマンティックな値渡しのみがあります
好奇心のために、オブジェクトを可変クラスにラップするだけで、refのようなセマンティクスをJavaに実装できます。
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();
}
}
テストケース:
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
(非プリミティブに対して)なぜ使用しないのですか?またはAtomicSomething
(例AtomicBoolean
:)プリミティブの場合?
int
代わりにInteger
、bool
代わりのBoolean
とそうで?つまり、ラッパークラス(構文を心配すると自動的にアンラップされる)が機能しません。
「Javaプログラミング言語」のJames Goslingから:
「... Javaにはパラメーターを渡すモードが1つだけあります-値で渡す-これは物事をシンプルに保ちます...」
The pronouncement of the language god should be declared the answer
そうでもない。Javaの作成者が考えたり信じたりしていることにかかわらず、絶対的な答えは言語仕様の引用から得られます。