如何以较少的费用从 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】:返回对象或布尔值的愿望很糟糕。您在不完全了解如何处理异常或“无”结果的初学者代码中经常看到这种“标志”。
如果布尔值表示一个异常,就让它过去或在另一个异常中重新抛出它。例如。 IllegalArgumentException
、IllegalStateException
、UnsupportedOperationException
等,具体取决于功能要求。您可以将调用代码放在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 值)?的主要内容,如果未能解决你的问题,请参考以下文章