7

我是 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类型和强制转换,或者为我最终将使用的类型创建一个新类(例如StringTryResult)。

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

4

2 回答 2

3

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

在 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 回答