2012-02-22 8 views
3

Stringのレコードのリストをオブジェクトに解析し、オブジェクトのListを返すメソッドがあります。だから私のメソッドシグネチャはこのようなものです。メソッドから2つの異なる値を返す

public List<ParsedObject> parse(String[] records);

しかし、私はまた、正常に解析されなかった文字列レコードの数のような他のメトリックを返したいと思います。今私は混乱し、この指標を返す方法。 1つのオプションは、解析されたレコードのリストとこれらのメトリックを格納するメンバーの両方を保持する別のラッパークラスを作成することです。

しかし、私はこの状況に非常によく遭遇し、この方法で多くのラッパークラスを作成することになります。

私がうまく説明しているかわかりません。ここに何か提案はありますか?

+0

parse()メソッドが宣言されているクラスに他の変数を含めることができます(OOPの概念に合っている場合)。これらの値にアクセスするためのgetterメソッドを記述できます。 – JProgrammer

+0

1レコードにつき1オブジェクトを解析する予定ですか?そうであれば、呼び出しコードはリストのサイズをレコードの長さと比較することができます。 – jlewis42

+0

これはほんの一例ですが、この場合はうまくいくでしょう。 – RandomQuestion

答えて

5

Javaは、関数から複数の値を返すことをサポートしていません。あなたは言ったように、ラッパークラスを作成することができます。もう一つの選択肢は、整数の配列または "メトリック"オブジェクトまたはそのようなものを渡し、それをParse内で変更することです。わずかに良いのは、必要な診断情報を追跡するために、メソッド変数ではなく1つ以上のインスタンス変数を持つことです。

+1

クイックラッパークラスはそれほど大きな投資ではありません。特に、1つのファイルの中にそれを必要とするだけで、数行の長さの内部クラスを作成することができます。 –

+0

私は、情報を追跡するためにインスタンス変数を使用するのは、1つのクラスにしかない場合は、よりクリーンなアプローチだと主張します。もちろん、合理的なアプローチです。 著者は、多くのラッパークラスを作成したくないと具体的に言及しました。そのため、代替案を説明することは効果的だと思いました。 –

+2

インスタンス変数を使用すると、スレッドセーフな方法でクラスを使用するのが難しくなりますが、避けてください。 – ARRG

1

はParseResultオブジェクトを作成します。 List、解析されたレコードの数、エラーなどを含めることができます。異なるメソッドから返されるように十分に汎用的にします。あなたはそれを基本クラスにして、そこから延びるクラスを返すことさえできます。ちょうどオブジェクトの観点から考えること。

0

ラッパークラスは、関数からより多くの情報を返す標準的な方法です。もう1つの選択肢は、別のパラメータを参照渡しして関数内で変更することで、呼び出し元に新しい情報を効果的に返すことです。たとえば、あなたの場合、空のリストを渡して、そのリスト内のすべての解析された要素を追加します。戻り値の型はメトリックまたはエラーコードです。したがって、発信者は両方の情報を保持します。

0

これはJavaを使用して開発している多くの人々にとって非常に一般的な問題です。 Scalaのような他の言語では、複数の値を保持できる匿名オブジェクトであるタプルを作成し、それらを引数または戻り値として使用できます。

5

あなたの質問は既に議論されています(例:Should Java method arguments be used to return multiple values?を参照)。私は個人的には、返されたデータが関連していなければ、2つのメソッド呼び出しを行うべきだと思っています。そうであれば、それを呼び出すときに「ラッパー」クラスを作成する必要があります。彼らが実際に関連するデータであれば、おそらく同じクラスに属している可能性があります。

私はそれが副作用であり、メソッドが本当に何をしているのか分かりませんので、私は個人的にオブジェクトに渡す変更を好みません。

建物のオブジェクトが複雑な場合は、工場パターン(http://en.wikipedia.org/wiki/Factory_method_patternを参照)を使用することも考えられます。

1

リストと必要なすべての情報を含む複雑なオブジェクトを返すことができます。

関連する問題