7

私は try/do (または trier/doer) パターンのファンです。これは、outパラメータを使用して C# で実装するのが最適です。

DateTime date;
if (DateTime.TryParse("2012-06-18", out date))
{
    //Do something with date
}

私は現在、Java 1.5 プロジェクトに取り組んでいます。このプロジェクトでは、try/do パターンを実装するメソッドから返される TryResult という新しいクラスを使用して、try/do パターンを実装しています。

public class TryResult<ResultType> {

    private boolean mSuccess = false;
    private ResultType mResult = null;

    public TryResult(boolean success, ResultType result) {
        super();
        this.mSuccess = success;
        this.mResult = result;
    }

    public boolean isSuccess() {
        return mSuccess;
    }

    public ResultType getResult() {
        return mResult;
    }

}

これはうまく機能していますが、このコードを J2ME を使用する別のプラットフォームに移植する予定であるため、ジェネリックは使用できません。

私の現在のオプションは、上記のクラスからジェネリックを削除しTryResultて単純な古いものObjectとキャストを使用するか、最終的に使用するタイプの新しいクラスを作成することです (例: StringTryResult)。

J2ME/Java 1.3 でこのパターンを実装するより良い方法はありますか?

4

2 に答える 2

3

実装しようとしているのは、関数型言語ではMaybe モナドと呼ばれます。

Java でこれを行う実験があります。ここここを参照してください。

残念ながら、Java の型システムは、これを大規模にサポートするほど高度ではありません。また、標準ライブラリはそのようなものをサポートしていないため、そのような構造の使用を独自のコードのみに減らします :(

これをサポートする言語については、 ScalaClojureを参照してください。

Java ME に関して言えば、このためだけに特殊な型を実装することについて、私はよく考えます。それはアイデア理論では素晴らしいことですが、物事をより困難にするでしょう。アプリ全体ですべてのタイプを複製します。

于 2012-06-18T16:38:20.690 に答える
0

私はこれを決して支持しませんがout、Java で " " 変数を実行する本当にローテクな方法は、単一要素配列を使用することです。

String input = ...;
Date[] date = { null };
if (DateParser.tryParse(input, date)) {
  System.out.println(date[0]);
}
于 2012-06-18T16:34:31.137 に答える