如何以较少的费用从 java 中的方法返回两个值(1.Collection,2.Single Boolean 值)?

Posted

技术标签:

【中文标题】如何以较少的费用从 java 中的方法返回两个值(1.Collection,2.Single Boolean 值)?【英文标题】:how to return two values(1.Collection, 2.Single Boolean value) from a method in java with less expense? 【发布时间】:2011-09-05 03:56:14 【问题描述】:

我有一个 Main 类和 VOCollection 类。 在主类中有一个名为 getStatus() 的方法,只有从这个方法我得到一些状态(真,假),如果状态为真,我需要返回一个集合。 目前我有两个想法,但都很贵。

    return map,它很昂贵,因为设置 Boolean 进行集合会导致代码混乱,并且只有一个 Boolean 值就足够了(但我们返回多个)。

    在 VOCollection 类中创建一个实例变量,并使用 getter 和 setter 来获取和设置布尔值。这也很贵。 (在另一个类中创建一个变量)。

给我更便宜的解决方案。

【问题讨论】:

你的问题很不清楚。为每个选项显示一些示例代码。 【参考方案1】:

有很多方法可以做到这一点:

返回 null 表示不存在类似 java.util.Map.get() 的内容 创建自定义类以返回两个参数。 (见其他答案) 使用 1 元素数组作为返回值之一。 布尔方法(列表 [] 结果) 结果[0] = 答案; 返回标志; 使用像 Google Guava 这样具有 Pair/Tuple 类的库: 配对方法() 返回新对(标志,答案); 更改您的代码,使其不是必需的,这通常是正确的答案。查看异常注释或更改传递方式。

【讨论】:

【参考方案2】:

返回对象或布尔值的愿望很糟糕。您在不完全了解如何处理异常或“无”结果的初学者代码中经常看到这种“标志”。

如果布尔值表示一个异常,就让它过去或在另一个异常中重新抛出它。例如。 IllegalArgumentExceptionIllegalStateExceptionUnsupportedOperationException 等,具体取决于功能要求。您可以将调用代码放在try-catch 中并进行相应处理。

或者如果布尔值表示“无”状态,则返回null 或空集合。可以通过调用方法后测试返回值来处理。

【讨论】:

【参考方案3】:

你可以这样介绍一个类

class StatusResult

    public final bool status;
    public final VOCollection result;

    ...

并将getStatus()的签名改为

StatusResult getStatus()

【讨论】:

如果我没看错你的问题,这就是你想要的。如果 Java 在这种情况下支持元组就好了。【参考方案4】:

我过去也遇到过同样的情况。

您提到的两种解决方案都是可行的,因为您说它们可能很昂贵。

事实上,Java 不支持一个方法的多个返回值。

我实施的解决方案是

我将尝试以这种方式解析/创建/编码字符串,解码后我应该能够知道我需要做什么。

在你的情况下,我会选择以下路径 创建一个类似于 returnValue 的字符串,让该字符串以 0 或 1 开头,如果它的 1 为真,否则为假。 并将第二个返回值附加到那个。

例如,您尝试像“returnValue1”和“true”一样返回 为真让我们保持 1 为假让我们保持 2 当你这样做时,你的返回值将变为“1returnValue1”

【讨论】:

【参考方案5】:

当“状态为真”时简单地返回集合。否则返回null。

但是: 通过调用名为“getStatus()”的方法获取集合不是我所期望的。

"getStatus()" 听起来获得了一些表示内部状态的常数值。 (比如枚举常量,int状态码等等)

在您的场景中,我建议让一个方法返回一个布尔值,指示“我有什么或没有”,而另一种方法返回集合 - 你有什么或没有时为 null。 然后可以通过调用集合方法检查!= null 来轻松实现布尔方法。

public boolean isXyz() 
    return getXyz() != null;


public Collection getXyz() 
    return yourCollection; //maybe null

【讨论】:

【参考方案6】:

最简单的方法可能是始终返回一个 VOCollection。对于没有数据的情况,您可以返回一个没有数据的集合,即 isEmpty() 为真,或者一个具有标志的集合(但我更喜欢第一个选项)。

为避免每次都创建一个对象,请创建一个不可变 VOCollection 的单个实例,而无需任何条目。这是没有数据时可以返回的。

【讨论】:

以上是关于如何以较少的费用从 java 中的方法返回两个值(1.Collection,2.Single Boolean 值)?的主要内容,如果未能解决你的问题,请参考以下文章

Rails:使用范围来显示模型的不同子集以及如何以较少 DRY 的方式构建它?

在表达较少的双峰数据上拟合两个高斯

软件测试用例设计方法

Sas程序优化使用较少的工作空间

在奇数位置提取列表元素

在 Wcf REST 中,返回请求较少的较大模型还是返回请求较多的较小模型更好