在Java中尝试/执行模式实现

时间:2012-06-18 14:46:29

标签: java java-me design-patterns

我是try / do(或trier / doer)模式的粉丝,最好在C#中使用out参数实现,例如:

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

我目前正在开发一个Java 1.5项目,我正在使用一个名为TryResult的新类来实现try / do模式,该类是从实现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和强制转换,或者为我最终使用的类型创建一个新类(例如{{ 1}})。

有没有更好的方法在J2ME / Java 1.3上实现这种模式?

2 个答案:

答案 0 :(得分:3)

您尝试实现的内容在函数式语言中称为Maybe monad

有一些实验要在java中执行此操作,请参阅herehere

问题是,遗憾的是,Java的类型系统还不够先进,无法大规模地支持它。而且,标准库不支持这样的任何东西,这样就减少了将这种构造用于你自己的代码: (

有关支持此功能的语言,请参阅ScalaClojure

就Java ME而言,我只是为了这个而考虑实现特殊类型。这是一个很好的理论理论,然而,它会使事情变得更加困难,例如。复制整个应用中的所有类型。

答案 1 :(得分:0)

我不支持任何方式,但在Java中使用“out”变量的一种非常低技术的方法是使用单个元素数组:

String input = ...;
Date[] date = { null };
if (DateParser.tryParse(input, date)) {
  System.out.println(date[0]);
}