Java : 참조로 int를 전달하는 가장 좋은 방법


84

바이트 버퍼에서 인코딩 된 길이를 구문 분석하는 구문 분석 함수가 있으며, 구문 분석 된 길이를 int로 반환하고, 인덱스를 정수 인수로 버퍼에 가져옵니다. 함수가 구문 분석 된 내용에 따라 인덱스를 업데이트하기를 원합니다. 즉, 해당 인덱스를 참조로 전달하고 싶습니다. C에서는 int *. Java에서이 작업을 수행하는 가장 깨끗한 방법은 무엇입니까? 현재 인덱스 인수 전달을 검토 중입니다. 로 int[],하지만 약간 못 생겼습니다.


13
Integer불변입니다.
Yuval Adam

1
아파치 라이브러리를 피하려면 int를 전달하고 업데이트 된 값을 반환 할 수 있습니다. 두 개의 값이면 Point를 컨테이너로 사용하는 것이 좋습니다. 그렇지 않으면 배열 옵션이나 여기에있는 다른 제안 중 하나가 좋습니다.
EntangledLoops

int 또는 객체를 반환해야합니다. 당신이 정말로 하나 이상이 필요한 경우, 아마 당신은 당신의 '클래스'디자인을 다시 생각한다
Ujjwal 싱

답변:


72

org.apache.commons.lang.mutable.MutableIntApache Commons 라이브러리에서 사용해 볼 수 있습니다 . 언어 자체에서이를 수행하는 직접적인 방법은 없습니다.


24

자바에서는 불가능합니다. 당신이 제안한 한 가지 방법은 int[]. 다른 하나는 예 IntHolder를 들어 int.


20

Java에서는 참조로 인수를 전달할 수 없습니다.

할 수있는 일은 정수 값을 가변 객체로 감싸는 것입니다. Apache Commons를 사용 MutableInt하는 것이 좋은 선택입니다. 약간 더 난독 한 또 다른 방법은 int[]제안한 것과 같은 것을 사용하는 것입니다. 왜 int단일 셀 배열 로 래핑하는지 명확하지 않기 때문에 사용하지 않을 것 입니다.

참고 java.lang.Integer변경할 수 없습니다.


AtomicInteger의 사용법은 어떻습니까? 이것은 변경 가능하고 참조를 통해 전달됩니까? (Afaik AtomicReference <Boolean>이 올바르게 수행합니다.)
icbytes


14

바이트 버퍼와 인덱스를 ByteBuffer 객체 로 래핑 합니다. ByteBuffer는 버퍼 + 위치의 개념을 캡슐화하고 인덱스 된 위치에서 읽고 쓸 수 있도록하여 진행하면서 업데이트합니다.


6
바로 그거죠. Java가 원하는 방식으로 수행하도록 강요하지 말고 Java 방식으로 수행하십시오. Java는 C가 아닙니다. C처럼 작동하도록 만들려는 시도는 항상 추악한 해킹입니다.
Skip Head

9

다음과 같이 새 클래스를 디자인 할 수 있습니다.

public class Inte{
       public int x=0;
}

나중에이 클래스의 객체를 만들 수 있습니다.

Inte inte=new Inte();

그런 다음 inte정수 변수를 전달할 인수로 전달할 수 있습니다 .

public void function(Inte inte) {
some code
}

따라서 정수 값을 업데이트하려면 다음을 수행하십시오.

inte.x=value;

가치를 얻기 위해 :

Variable=inte.x;

8

참조 클래스를 만들어 기본 요소를 래핑 할 수 있습니다.

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}

그런 다음 참조를 매개 변수로 사용하는 함수를 만들 수 있습니다.

public class Utils
{
    public static <T> void Swap(Ref<T> t1, Ref<T> t2)
    {
        T temp = t1.Value;
        t1.Value = t2.Value;
        t2.Value = temp;
    }
}

용법:

Ref<Integer> x = 2;
Ref<Integer> y = 9;
Utils.Swap(x, y);

System.out.println("x is now equal to " + x.Value + " and y is now equal to " + y.Value";
// Will print: x is now equal to 9 and y is now equal to 2

도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.