Javaのメソッドパラメータのデフォルト値を取得する唯一の方法は本当にオーバーロードですか?
-
03-07-2019 - |
質問
私はJavaとPythonおよびPHPを初めて使用し、関数パラメーターのデフォルト値に慣れています。
したがって、値の一部のみを設定するわずかに異なる状況から呼び出されるように設計されたメソッドを記述する習慣があります。たとえば、私のPHPコードでは、オブジェクトインスタンスにわずかに異なるプロパティを提供するファクトリメソッドがある場合、これは一般的です。
Javaでは、すべてのパラメーターを期待する1つのメソッドが必要であり、いくつかのパラメーターをデフォルトに設定し、呼び出し側が提供するいくつかのオーバーロードバリエーションを呼び出す必要があります。それはまあ、大丈夫ですが、時々私の神経に乗ることができます。
これは、C ++とActionScriptの簡単なエクスカーションで既に悩まされたことを覚えています。さて、より経験豊富なJava開発者はこのための近道を持っていますか?
技術的には、質問はすべての投稿の合計で「はい、そうです」と回答されているようです。さまざまな代替ソリューションを収集するために、以下のウィキ投稿を開きました。必要に応じて貢献してください。これらはすべて、インスピレーションとして、また典型的なJavaコンストラクトの学習例として非常に役立ちました。
解決 6
「はい、そうです」のように見えますが、以下を除きます:
推奨される varargs を使用すると、同様の効果が得られます。 Paul Whelanによって、またはJon Skeetによって提案された適切なデフォルト値を持つフィールドとしてパラメータを運ぶ追加の型を定義することによって。ボリス・パブロヴィ&ć彼の型は物事を適切な場所にきちんと保つための内部静的クラスになり得ると付け加えました。
短所(この質問全体は深刻な意味合いではなく、便利な微調整に関するものです):
可変引数は、名前のリストなど、非常に類似した形式でほとんど同等の意味を持つ値の可変長リストを渡すのに最も適しているようです。質問に記載されている目的に使用する場合、メソッドはリストを解釈するためにリストでさまざまなチェックを実行する必要があります。
パラメータを保持する特殊な型は、結果の型が特定のメソッドに渡されるだけでなく、より複雑なパラメータのセットである場合に最も有用と思われます。 2〜4個のパラメーターがあり、一部にデフォルト値が設定されている場合でも、オーバーロードする方が少し便利なようですが、それは個人的な好みの問題かもしれません。
他のヒント
別のオプションは、ビルダーパターンのバリエーションです。すべてのパラメーターを表す型があり、その型のインスタンスを構築し(それに応じて既定値が設定されます)、必要なプロパティを設定し、結果を元のメソッドに渡します、または「パラメータタイプ」にメソッドを追加します。メソッドを呼び出します。
ProcessBuilder
および プロセス
クラス。
可変引数を参照
http ://www.java-tips.org/java-se-tips/java.lang/using-the-varargs-language-feature.html
(更新されたURL。stackoverflowには> 30文字が必要なため、このコメントが追加されました)
これを簡単にするために、デフォルト値の注釈と、オーバーロードされたメソッドを含むスーパークラスを生成する注釈プロセッサを作成しました。例:
protected void process(
Processor processor,
String item,
@Default("Processor.Size.LARGE") Size size,
@Default("red") String color,
@Default("1") int quantity) {
...
}
(生成されたスーパークラスで)生成する
protected void process(sample.Processor processor, java.lang.String item) {
process(processor, item, Processor.Size.LARGE, "red", 1);
}
protected void process(sample.Processor processor,
java.lang.String item,
sample.Processor.Size size) {
process(processor, item, size, "red", 1);
}
protected void process(sample.Processor processor,
java.lang.String item,
sample.Processor.Size size,
java.lang.String color) {
process(processor, item, size, color, 1);
}
protected abstract void process(sample.Processor processor,
java.lang.String item,
sample.Processor.Size size,
java.lang.String color,
int quantity) ;
言語プロセスをある言語から別の言語に翻訳しようとするのは非常に困難です。他の人が指摘したように、あなたはおそらくあなたが望むものを得るためにいくつかの回避策を行うことができます...しかし、より早くあなたが「受け入れる」 Javaでの作業がより良くなるようにJavaが設計されている方法。
いくつかのPHPをやらなければなりませんでした...私が望んでいたことをすることができなかったことに最後までイライラしました...
あなたが遭遇する最大の障害は、おそらく静的型付けです。この問題を回避するためにできることはいくつかありますが、最終的には非常に大きなハックになります。
C ++の初期の頃、人々はC ++がSmalltalkのように振る舞うように説得しようとしました...うまく機能しませんでした。初期の頃、Javaの人々がC ++の知識をJavaで使用しようとしてもうまくいきませんでした(言語が表面上非常に似ているため、これは二重にイライラします)。
Javaコーディングについては、PHP開発者ではなくJava開発者のようにプログラミングすることをお勧めします。
差し迫った問題のために、異なる変数が設定された同じ種類のオブジェクトを作成するのではなく、実際にファクトリから異なるクラスを再チューニングする必要がある可能性はありますか?
オブジェクト指向でコーディングする限り、Javaのデフォルト値を見逃すことはありません。デフォルトの引数は、手続き型コーディングスタイルでのみ便利です。
オブジェクト指向では、メソッド/プロシージャを介して状態を渡すのではなく、状態はすでに呼び出すオブジェクト、またはパラメーターとして渡すオブジェクトにあります。ほとんどの場合、メソッドに必要なパラメーターは1つまたは2つだけです。
オブジェクトを使用する前に構成する場合、単純なコンストラクターでオブジェクトを作成し、異なるセッターを呼び出します。これにより、多くの引数を持つコンストラクターを呼び出すよりも、コードがはるかに読みやすくなります(セッター名が表示されるため)。 また、後で新しい属性が追加された場合は、既存のファクトリメソッドを変更せずにオブジェクトに追加できます。
はい、oopのオーバーロードはjavaでDefaultパラメータを使用する唯一の方法です。 しかし、ここにあなたのためのハックがあります。 オーバーロードを使用し、デフォルトパラメータを使用する場合。すると
public void methodA(A arg1) { }
public void methodA( B arg2,) { }
public void methodA(C arg3) { }
public void methodA(A arg1, B arg2) { }
public void methodA(A arg1, C arg3) { }
public void methodA( B arg2, C arg3) { }
public void methodA(A arg1, B arg2, C arg3) { }
しかし、可変引数を使用して
public class DefaultValue
{
public static void main(String[] args)
{
defaultParameter();
defaultParameter(true);
}
public static void defaultParameter(Boolean …gender)
{
boolean genderBoolean = false; // It is the default value you want to give
if(1 == gender.length)
{
genderBoolean = gender[0]; // Overrided Value
}
System.out.println(genderBoolean);
}
}
上記のコード出力は次のようになります
false
true
より類似した例と説明については、 java-default-parameter-values <をご覧ください。 / p>