Java 변수 매개 변수 목록
코드 사본은 다음과 같습니다.
클래스 A {}
모든 클래스가 객체에서 상속되므로 객체 배열을 매개 변수로 사용할 수 있습니다.
공개 클래스 매개 변수 {static void printArray (Object [] args) {for (object obj : args) {system.out.print (obj + ""); } system.out.println (); } public static void main (String [] args) {printArray (new Object [] {New Object [47), New Float (3.14), New Double (11.11)}); printArray (new Object [] { "one", "two", "where"}); printArray (new Object [] {new a (), new a (), new a ()}); }} 기능을 추가 한 후 Java SE5 버전의 경우 다음을 작성할 수 있습니다.
공개 클래스 매개 변수 {public static void printArray (object ... args) {for (object obj : args) {system.out.print (obj + ""); } system.out.println (); } public static void main (String [] args) {printArray (새 정수 (47), New Float (3.14), New Double (11.11)); StrintArray (47, 3.14f, 11.11); printArray ( "하나", "둘", "셋"); printarray (new a (), new a (), new a ()); printArray ((Object []) 새 정수 [] {1, 2, 3, 4}); printArray (); }} 객체를 사용하여 매개 변수 목록을 생각할 수 있습니다.
public class varargtype {static void f (문자 ... args) {system.out.print (args.getClass ()); System.out.println ( "길이" + args.length); } static void g (int ... args) {system.out.print (args.getClass ()); System.out.println ( "길이" + args.length); } public static void main (String [] args) {f ( 'a'); 에프(); g (1); g(); System.out.println ( "int []" + new int [0] .getClass ()); }}이것은 Java 5에 도입 된 기능입니다. 메소드가 수신하려는 매개 변수 수가 불확실한 경우이 기능은 유용 할 수 있습니다.
예를 들어, IO 작업이 관련된 경우 기본적으로 입력 및 출력의 최소한 두 개의 스트림을 닫아야합니다. 스트림 닫기 작업을 다음 방법으로 캡슐화하여 한 번의 호출만으로 여러 개의 스트림을 닫을 수 있습니다.
public static void CloseSilent (Closeable ... CloseAbles) {for (Closeable : CloseAbles) {if (closeable! = null) {try {closeable.close (); } catch (ioexception 무시) {}}}}이 기능은 다음과 같은 기능과 함께 사용하기에 적합하다고 생각하는 유일한 곳입니다.
이 매개 변수는 동일한 유형을 갖습니다.
매개 변수 수는 불확실하고 각각은 선택 사항입니다.
예를 들어,이 매개 변수의 사용은 동일합니다. 예를 들어, 위는 모두 실행됩니다.
Java 변수 길이 매개 변수 목록은 메소드 매개 변수 목록의 끝에만 배치 할 수 있습니다.
Java 변수 길이 매개 변수 목록 구현
Java 변수 길이 파라미터 목록의 구현은 컴파일러를 통해 전달되어 이러한 매개 변수를 배열로 캡슐화합니다.
예를 들어, 위의 방법의 서명은 실제로 : CloseSilent (Closeable [] Closeables) void입니다.
구덩이를 밟습니다
두 곳에서 A와 B에 의해 호출되는 방법이 있습니다. 9 월에는 매개 변수를 A에 추가해야합니다. 내 마음이 미쳤을 때 변수 길이 매개 변수 목록을 사용하기로 결정했습니다. 나는 그것을 B로 바꿀 필요가 없다고 생각했다. 그래서 구덩이가 묻혔다.
최근에 B에게 두 개의 새로운 매개 변수를 여기에 추가하도록 요청 했으므로 메소드 매개 변수 목록에 매개 변수를 계속 추가합니다. 이러한 매개 변수의 유형은 다르므로 변수 길이 매개 변수 목록은 객체 유형으로 선언됩니다.
첫 번째 구덩이는이 방법에서 가변 길이 매개 변수를 갖는 요소를 취할 때 일부 매개 변수가 전달되지 않으며 배열이 오프사이드 예외가 직접 파괴된다는 것을 고려하지 않습니다. 가변 길이 매개 변수 목록이 좋지 않다고 느꼈으므로 필요하지 않은 고정식 매개 변수로 변경했습니다.
수정 후 테스트 환경에서 테스트하는 것이 좋습니다. 생산 환경에서 여러 클래스를 교체 한 후 결과는 오류가 발생합니다. 방법을 찾을 수 없습니다. 메소드 서명에 따라 다르지만 배열이며 교체되지 않았습니다. 소스 코드에서 판단하면 통화 위치를 변경할 필요가 없으므로 교체 할 것으로 예상되지 않았습니다. 테스트 환경이 완전히 포장되었으므로 문제가 없습니다.
이 방법의 시그니처는 컴파일 시점에 결정됩니다. 소스 코드 레벨에는 수정이 필요하지는 않지만 컴파일 된 클래스를 교체 할 필요가 없음을 의미하지는 않습니다.
실제로,이 경우 불규칙한 패키지의 경우 소스 코드에서 상수 값을 변경 한 후 상수를 정의하는 클래스 파일 만 교체 되며이 상수를 참조하는 모든 클래스 파일을 다시 컴파일하고 바꾸지 않아 설명 할 수없는 문제가 발생합니다. 본질적으로 메소드 서명과 동일한 문제입니다.