programing

Java에서 파라미터를 참조로 전달할 수 있습니까?

bestcode 2022. 7. 16. 15:12
반응형

Java에서 파라미터를 참조로 전달할 수 있습니까?

다음과 같은 의미론을 원합니다.C#의 키워드입니다.

자바는 모든 것이 값으로 전달되기 때문에 혼란스럽다.그러나 기준 유형의 매개변수(즉, 원시 유형의 매개변수가 아님)의 경우 값에 의해 전달되는 기준 자체이므로, 이는 통과 기준인 것처럼 보인다(그리고 사람들은 종종 그렇다고 주장한다.이는 다음과 같이 해당되지 않습니다.

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에서 파라미터를 참조로 전달할 수 있습니까?

아니요.

이유: Java에는 메서드에 인수를 전달하는 모드(값 기준)가 하나뿐입니다.

주의:

프리미티브의 경우 값의 복사본을 얻을 수 있기 때문에 이해하기 쉽습니다.

다른 모든 경우 참조 복사본이 제공되며 이를 값별 전달이라고도 합니다.

이 모든 것이 이 사진에 나와 있습니다.

여기에 이미지 설명 입력

Java에서는 ref와 유사한 언어 레벨은 없습니다.Java에서는 값 의미 전달만 있습니다.

호기심을 위해 Java에서 ref와 같은 시멘틱을 구현할 수 있습니다.단순히 오브젝트를 가변 클래스로 랩핑합니다.

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"

"Java Programming Language"의 James Gosling으로부터:

"...Java에는 정확히 하나의 매개 변수 전달 모드가 있습니다. - pass by value - 이 모드를 사용하면 모든 것이 단순해집니다."

난 네가 할 수 있다고 생각하지 않아.가장 좋은 옵션은 "참조별"을 다른 클래스 인스턴스에 캡슐화하고 (외부) 클래스의 참조를 (값별로) 전달하는 것입니다.무슨 말인지 아시겠죠?

즉, 메서드는 전달된 객체의 내부 상태를 변경하여 발신자가 볼 수 있도록 합니다.

Java는 항상 값으로 전달됩니다.

프리미티브를 전달하면 값의 복사본이 되고 개체를 전달하면 참조 포인터의 복사본이 됩니다.

다른 옵션은 예를 들어 어레이를 사용하는 것입니다.void method(SomeClass[] v) { v[0] = ...; }그러나 1) 메서드를 호출하기 전에 어레이를 초기화해야 하며 2) 여전히 이러한 방식으로 스왑 메서드를 구현할 수 없습니다.이 방법은 JDK에서 사용됩니다(예:java.util.concurrent.atomic.AtomicMarkableReference.get(boolean[]).

답변은 http://stackoverflow.com/a/9324155/1676736에서 확인하시기 바랍니다.

거기서 나는 래퍼 클래스 아이디어의 단순한 버전을 사용했다.나는 세터/게터를 표준으로 좋아하지 않는다.밭을 파묻을 이유가 없을 때 나는 그것을 '공개'한다.특히 이런 일에서는요

단, 이것은 프리미티브 또는 멀티 파라미터/타입 리턴을 제외한 모든 경우에 유효합니다.

public class Ref<T> {
    public T val;
}

하지만 타입 파라미터를 더 추가해도 될 것 같습니다.그러나 목적에 맞는 내부 정적 클래스를 만드는 것이 더 쉬울 것입니다.

public static class MyReturn {
    public String name;
    public int age;
    public double salary;
}

이것은 다른 이유로 필요하지 않을 때 사용할 수 있습니다.

MyReturn mRtn = new MyReturn();

public void myMethod(final MyReturn mRtn){
    mRtn.name = "Fred Smith";
    mRtn.age = 32;
    mRtn.salary = 100000.00;
}

System.out.println(mRtn.name + " " +mRtn.age + ": $" + mRtn.salary);

언급URL : https://stackoverflow.com/questions/1068760/can-i-pass-parameters-by-reference-in-java

반응형