source

자바에서는 언제 varargs를 사용합니까?

goodcode 2022. 7. 17. 00:26
반응형

자바에서는 언제 varargs를 사용합니까?

난 바라그가 무서워.나는 그것들을 어디에 써야 할지 모르겠다.

게다가, 사람들이 원하는 만큼 논쟁을 통과하게 하는 것은 위험하다고 느껴져.

이러한 기능을 사용하는 데 적합한 컨텍스트의 예는 무엇입니까?

vararargs미확정 수의 객체를 처리해야 하는 모든 메서드에 유용합니다.한 가지 좋은 예는 입니다.형식 문자열은 임의의 수의 매개 변수를 수용할 수 있으므로 임의의 수의 개체를 전달하기 위한 메커니즘이 필요합니다.

String.format("This is an integer: %d", myInt);
String.format("This is an integer: %d and a string: %s", myInt, myString);

경험에 근거한 좋은 규칙은 다음과 같습니다.

"입력으로서 T의 배열이 필요한 메서드(또는 컨스트럭터)에는 vararargs를 사용합니다."

에 의해, ( 「 」, 「 」, 「 」, 「 」( 「 」는 필요 없습니다).new T[]{...}를 참조해 주세요.

하면 '아까보다'가 메서드를 할 수 있습니다.List<T>이 인수가 입력 전용인 경우(즉, 목록은 메서드에 의해 변경되지 않습니다).

저는 ,, 는, 저, 저, 저, 저, 저, addition, addition, addition, addition, addition, addition, addition, addition, addition, addition, addition, addition, addition, addition, addition ,f(Object... args)API가 불분명한 프로그래밍 방식으로 미끄러지기 때문입니다.

예를 들어 Design Grid Layout에서 여러 개를 추가할 수 있습니다.JComponent call s in one call:

layout.row().grid(new JLabel("Label")).add(field1, field2, field3);

는 add()로 .add(JComponent... components).

마지막으로, 이러한 메서드의 구현은 빈 변수와 함께 호출될 수 있다는 사실을 고려해야 합니다.인수를 하나 이상 부과하려면 다음과 같은 추악한 방법을 사용해야 합니다.

void f(T arg1, T... args) {...}

나는 이 트릭이 추하다고 생각한다. 왜냐하면 이 방법의 구현은 단순한 방법보다 덜 간단하기 때문이다.T... args이치노

이것이 varargs에 대한 요점을 명확히 하는 데 도움이 되기를 바랍니다.

디버깅을 위해 로그 출력에 varargs를 자주 사용합니다.

내 앱의 거의 모든 클래스에서 debugPrint() 메서드가 있습니다.

private void debugPrint(Object... msg) {
    for (Object item : msg) System.out.print(item);
    System.out.println();
}

그리고 클래스의 메서드 내에서 다음과 같은 콜이 있습니다.

debugPrint("for assignment ", hwId, ", student ", studentId, ", question ",
    serialNo, ", the grade is ", grade);

코드가 동작하고 있다고 판단되면 debugPrint() 메서드로 코드를 코멘트하여 로그에 불필요한 정보가 너무 많이 포함되지 않도록 합니다.다만, 개개의 콜은 debugPrint()에 코멘트 없이 남겨 둘 수 있습니다.나중에 버그가 발견되면 debugPrint() 코드의 코멘트를 해제하면 debugPrint()에 대한 모든 콜이 다시 활성화됩니다.

물론, 저는 쉽게 varargs를 회피하고 대신 다음을 할 수 있습니다.

private void debugPrint(String msg) {
    System.out.println(msg);
}

debugPrint("for assignment " + hwId + ", student " + studentId + ", question "
    + serialNo + ", the grade is " + grade);

단, 이 경우 debugPrint() 코드를 코멘트 아웃하면 결과 문자열에서는 아무것도 실행되지 않아도 서버는 모든 콜에서 모든 변수를 debugPrint()에 연결하는 문제를 겪어야 합니다.단, varargs를 사용하는 경우 서버는 vargs가 필요하지 않음을 인식하기 전에 vargs를 배열에 배치하기만 하면 됩니다.많은 시간이 절약됩니다.

varargs는 메서드에서 전달되는 인수의 수가 불분명한 경우에 사용할 수 있습니다.백그라운드에서 지정되지 않은 길이의 매개 변수 배열을 생성하고 이러한 매개 변수를 런타임에 배열로 처리할 수 있습니다.

다른 파라미터 수를 받아들이기 위해 오버로드된 메서드가 있는 경우 메서드를 오버로드하는 것이 아니라 단순히 varargs 개념을 사용할 수 있습니다.

또한 파라미터의 유형이 다를 경우 "Object...test"를 사용하면 코드가 많이 간소화됩니다.

예를 들어 다음과 같습니다.

public int calculate(int...list) {
    int sum = 0;
    for (int item : list) {
        sum += item;
    }
    return sum;
}

여기서 간접적으로 int 타입(리스트)의 배열은 파라미터로 전달되며 코드 내의 배열로 취급됩니다.

이해를 돕기 위해 다음 링크를 클릭해 주십시오(이 개념을 명확하게 이해하는 데 큰 도움이 되었습니다).http://www.javadb.com/using-varargs-in-java

추신: 저도 몰랐을 때는 바라그를 사용하는 것이 두려웠습니다.하지만 이제 익숙해졌다.「알고 있는 것에 집착해, 모르는 것을 두려워한다」라고 하는 말이 있듯이, 가능한 한 그것을 사용하면, 당신도 좋아하게 된다.

Varargs는 Java 버전 1.5에서 추가된 기능입니다.

왜 이걸 쓰죠?

  1. 메서드에 전달할 인수 수를 모르면 어떻게 됩니까?
  2. 메서드에 인수를 무제한으로 전달하려면 어떻게 해야 합니까?

이게 어떻게 작동하나요?

지정된 인수를 사용하여 배열을 만들고 배열을 메서드로 전달합니다.

예:

public class Solution {



    public static void main(String[] args) {
        add(5,7);
        add(5,7,9);
    }

    public static void add(int... s){
        System.out.println(s.length);
        int sum=0;
        for(int num:s)
            sum=sum+num;
        System.out.println("sum is "+sum );
    }

}

출력:

2

합계는 12입니다.

3

합계 21

나도 바라그와 관련된 두려움이 있어

발신자가 복수의 파라미터가 아닌 명시적인 배열로 메서드를 전달하면 해당 배열에 대한 공유 참조가 수신됩니다.

이 어레이를 내부에 보존할 필요가 있는 경우는, 발신자가 나중에 변경할 수 없게 하려면 , 우선 어레이를 클론 하는 것이 좋습니다.

 Object[] args = new Object[] { 1, 2, 3} ;

 varArgMethod(args);  // not varArgMethod(1,2,3);

 args[2] = "something else";  // this could have unexpected side-effects

이것은 나중에 상태가 바뀔 가능성이 있는 오브젝트를 통과하는 것과 크게 다르지 않지만, 일반적으로 어레이는 컴파일러가 내부적으로 작성한 새로운 것으로 안전하게 사용할 수 있기 때문에 이것은 확실히 예기치 않은 동작입니다.

필터 오브젝트의 종류를 취할 수 있는 컨스트럭터에는 varargs를 자주 사용합니다.예를 들어, Hadoop을 기반으로 하는 시스템의 대부분은 JSON에 대한 항목의 직렬화 및 직렬화를 처리하는 Mapper를 기반으로 하며, 각각 컨텐츠 항목을 가져와서 수정 및 반환하거나 null을 반환하여 거부하는 여러 프로세서를 적용합니다.

Java의 Var-Args 문서에서는 var arg의 사용이 매우 명확합니다.

http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

사용법에 대해 다음과 같이 써 있습니다.

"그래서 언제 varargs를 사용해야 할까요?클라이언트는 API가 제공할 때마다 이를 활용해야 합니다.코어 API의 중요한 용도에는 리플렉션, 메시지 포맷, 새로운 printf 기능이 있습니다.API 설계자는 이점을 진정으로 강조해야 하는 경우에만 이러한 기능을 사용해야 합니다.일반적으로 varargs 메서드를 오버로드하지 마십시오.그렇지 않으면 프로그래머는 어떤 오버로드가 호출되는지 파악하기 어렵습니다."

언급URL : https://stackoverflow.com/questions/766559/when-do-you-use-varargs-in-java

반응형