[解決済み] Javaオプションパラメータ
質問
Javaでオプションのパラメータを使用するにはどうすればよいですか? オプショナルパラメータをサポートしているのはどのような仕様ですか?
どのように解決するのですか?
Javaでオプションのパラメータをシミュレートするには、いくつかの方法があります。
-
メソッドのオーバーロード。
void foo(文字列 a, 整数 b) { {. //...
void foo(String a) { foo(a, 0); // ここでは、0はbのデフォルト値です。 }
foo("a", 2); foo("a")です。
この方法の限界の一つは、同じ型のオプションのパラメーターが2つあり、そのうちのどれかが省略できる場合はうまくいかないということです。
- Varargsです。
a) オプションのパラメータはすべて同じ型である。
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);
b) オプションパラメータの種類は異なる場合がある。
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");
この方法の主な欠点は、オプションのパラメータが異なる型である場合、静的な型チェックができなくなることです。さらに、各パラメータが異なる意味を持つ場合、それらを区別する方法が必要です。
-
ヌルです。 これまでのアプローチの限界に対処するために、NULL値を許可して、メソッド本体で各パラメータを分析することができます。
b = b != null ? b : 0; c = c != null ? c : 0; //... }
foo("a", null, 2)です。
現在、すべての引数値を提供する必要がありますが、デフォルトのものはNULLでもかまいません。
-
オプションのクラスです。 この方法はnullに似ていますが、デフォルト値を持つパラメータにはJava 8のOptionalクラスを使用します。
Integer b = bOpt.isPresent() ? bOpt.get() : 0; //... }
foo("a", Optional.of(2)); foo("a", Optional.absent())です。
Optionalは呼び出し元に対してメソッド契約を明示しますが、このような署名は冗長すぎると感じるかもしれません。
更新: Java 8 には
java.util.Optional
そのため、Java 8ではこの特別な理由のためにguavaを使用する必要はありません。メソッド名はちょっと違うけど。 -
ビルダーパターン。 ビルダーパターンはコンストラクターに使用され、別のビルダークラスを導入することで実装されます。
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, オブジェクト> パラメータ) { {. 文字列a = ""。 整数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では、この方法がより簡単になりました。
@SuppressWarnings("unchecked") 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); // d = ... } foo(Map.of("a","a", "b",2, "d","value"));
なお、これらのアプローチは、どれを組み合わせても望ましい結果を得ることができます。
関連
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
JQuery DataTable 详解
-
javaでクラスを作成すると、enclosing classでないように見える
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
org.glassfish.jersey.servlet.ServletContainer
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] なぜJava 8のOptionalは引数で使ってはいけないのか