首頁 > Java > java教程 > Java中如何模擬可選參數?

Java中如何模擬可選參數?

Mary-Kate Olsen
發布: 2024-12-15 13:54:19
原創
170 人瀏覽過

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可以是如果所有可選參數都相同,則用於模擬可選參數type:

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);
登入後複製

或者,可變參數也可以與不同的參數類型一起使用,但這需要額外的檢查:

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

對可選參數使用空值是另一種情況option:

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

foo("a", null, 2);
登入後複製

但是,這需要檢查方法體中的空值。

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();
登入後複製

Maps

當處理大量可選參數,使用映射將它們作為名稱-值對傳遞可以方便:

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板