>Java >java지도 시간 >Java에서 선택적 매개변수를 어떻게 시뮬레이션할 수 있습니까?

Java에서 선택적 매개변수를 어떻게 시뮬레이션할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-15 13:54:19178검색

How Can Optional Parameters Be Simulated in Java?

Java에서 선택적 매개변수 시뮬레이션

Java는 기본적으로 선택적 매개변수를 지원하지 않습니다. 그러나 이 기능을 시뮬레이션하는 방법은 다양합니다.

메서드 오버로딩

다양한 매개변수 목록을 사용하여 메소드를 오버로딩하면 일부에서 기본값을 제공하여 선택적 매개변수를 지정할 수 있습니다. 행동 양식. 예:

void foo(String a, Integer b) {
    //...
}

void foo(String a) {
    foo(a, 0); // Here, 0 is the default value for b
}

foo("a", 2);
foo("a");  // Uses the default value for b

그러나 동일한 유형의 선택적 매개변수가 여러 개 존재하는 경우 이 접근 방식은 번거롭습니다.

Varargs

Varargs는 다음과 같을 수 있습니다. 모든 선택적 매개변수가 동일한 경우 선택적 매개변수를 시뮬레이션하는 데 사용됩니다. 유형:

void foo(String a, Integer... b) {
    Integer b1 = b.length > 0 ? b[0] : 0;
    Integer b2 = b.length > 1 ? b[1] : 0;
    //...
}

foo("a");
foo("a", 1, 2);

또는 varargs를 다른 매개변수 유형과 함께 사용할 수도 있지만 이 경우 추가 확인이 필요합니다.

void foo(String a, Object... b) {
    Integer b1 = 0;
    String b2 = "";
    if (b.length > 0) {
        if (!(b[0] instanceof Integer)) { 
            throw new IllegalArgumentException("...");
        }
        b1 = (Integer)b[0];
    }
    if (b.length > 1) {
        if (!(b[1] instanceof String)) { 
            throw new IllegalArgumentException("...");
        }
        b2 = (String)b[1];
        //...
    }
    //...
}

foo("a");
foo("a", 1);
foo("a", 1, "b2");  // Note that the order of arguments matters

Nulls

선택적 매개변수에 null 값을 사용하는 것은 또 다른 방법입니다. option:

void foo(String a, Integer b, Integer c) {
    b = b != null ? b : 0;
    c = c != null ? c : 0;
    //...
}

foo("a", null, 2);

그러나 이를 위해서는 메서드 본문에서 null 값을 확인해야 합니다.

Optional 클래스

Java 8에서는 Optional 클래스를 도입했습니다. , 선택적 값을 나타내는 데 사용할 수 있습니다:

void foo(String a, Optional<Integer> bOpt) {
    Integer b = bOpt.isPresent() ? bOpt.get() : 0;
    //...
}

foo("a", Optional.of(2));
foo("a", Optional.<Integer>absent());

Builder 패턴

빌더 패턴은 일반적으로 생성자와 함께 사용되는 또 다른 접근 방식입니다.

class Foo {
    private final String a; 
    private final Integer b;

    Foo(String a, Integer b) {
      this.a = a;
      this.b = b;
    }

    //...
}

class FooBuilder {
  private String a = ""; 
  private Integer b = 0;
  
  FooBuilder setA(String a) {
    this.a = a;
    return this;
  }

  FooBuilder setB(Integer b) {
    this.b = b;
    return this;
  }

  Foo build() {
    return new Foo(a, b);
  }
}

Foo foo = new FooBuilder().setA("a").build();

지도

다수의 선택적 매개변수를 맵을 사용하여 이름-값 쌍으로 전달할 수 있습니다. 편리함:

void foo(Map<String, Object> parameters) {
    String a = "";
    Integer b = 0;
    if (parameters.containsKey("a")) { 
        if (!(parameters.get("a") instanceof Integer)) { 
            throw new IllegalArgumentException("...");
        }
        a = (Integer)parameters.get("a");
    }
    if (parameters.containsKey("b")) { 
        //...
    }
    //...
}

foo(ImmutableMap.<String, Object>of(
    "a", "a",
    "b", 2, 
    "d", "value")); 

Java 9에서는 맵에서 매개변수 값에 액세스하는 것이 더 쉬워졌습니다.

// ...
static <T> T getParm(Map<String, Object> map, String key, T defaultValue) {
  return (map.containsKey(key)) ? (T) map.get(key) : defaultValue;
}
// ...

void foo(Map<String, Object> parameters) {
  String a = getParm(parameters, "a", "");
  int b = getParm(parameters, "b", 0);
  // ...
}

foo(Map.of("a","a",  "b",2,  "d","value"));

이러한 접근 방식은 Java에서 선택적 매개변수를 시뮬레이션하기 위한 다양한 옵션을 제공하므로 다음을 선택할 수 있습니다. 귀하의 특정 요구에 가장 적합한 방법입니다.

위 내용은 Java에서 선택적 매개변수를 어떻게 시뮬레이션할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.