在Java中返回一对值的最佳方式是什么?
这是一个小问题,因为我可以轻松地组成一对班来完成这项工作。我不想这样做,我觉得应该有一些简单的,内置的,类似于java的方式来返回两个值。你们是做这件事的最好,最简单的方法?阵列?其他一些数据结构?在Java中返回一对值的最佳方式是什么?
据我所知,不幸的是没有在Java中的一对内置表示(我当然希望有)。就我个人而言,当我编写一个项目时,我发现一对类通常会很有用,我创建了一个通用的Pair<T, U>
类(这可能就是您所想的)。返回一个数组是一种快速而简单的方法,但是稍后您可能会后悔,因为使用您的方法的人会怀疑该方法是否会返回两个以上的值。
无论您选择哪种解决方案:只要您觉得需要配对,您应该考虑是否通过使用例如今天保存的时间。一个普通的Pair类真的值得向下一个阅读代码的人丢失信息(而且这个人可能在六个月内就是你)。为返回类型编写一个单独的类现在需要更多时间,但它会向使用您的方法的用户传达更多信息(即告诉用户返回值代表什么,并且包含这两个值的有用成员名称)。如果它是一种仅用于少数地方的非公开方法,则Pair更可接受。
但是,如果你是一个在混乱中兴旺发达的人,那么你可以将这些对子嵌套在一起!例如,返回一对
@ Sam Barnum:当然 - 我承认我自己做了几次。 :p虽然后来看起来不是很愉快,但是......(另一方面,在LISP中,所有列表都以这种方式表示,只有更漂亮的语法。) – 2011-06-07 22:31:03
@Sam Barnum,我喜欢嵌套成对的对梨也是! – Atreys 2011-06-08 02:01:40
如果两个都是整数,然后我会建议java.awt.Point中,但只是否则创建两个对象x和y
我建议不要这样做,因为它会让所有读取方法声明的人相信返回值代表一个几何点。 – 2011-06-07 21:17:55
在我目前工作的环境中,我认为这是一个很好的解决方案,因为我返回了两个整数。我忘了Point,谢谢你带来这个。 – Graham 2011-06-07 21:20:19
@格拉汉姆:如果这两个整数确实代表一个几何点,那么它很好;否则,在六个月内阅读你的代码的人(这个人可能就是你自己了)会被误导以相信你的方法返回一个几何点(虽然它真的返回,比如说除法运算的商和余数),并且由于误解而浪费的时间很容易超过你今天创建Pair类或更具体的类所需的时间。切勿仅因为“它具有正确类型的字段”而使用类。 – 2011-06-07 21:31:46
我在标准看到一个“对”最接近的一个容器类库是实现它的类Map.Entry
接口和AbstractMap.SimpleEntry
和AbstractMap.SimpleImmutableEntry
类。
如果两个对象都是相同的类,则数组更容易使用。
使用容器类是最简单的方法。
public class Pair<T, U> {
public final T t;
public final U u;
public Pair(T t, U u) {
this.t= t;
this.u= u;
}
}
三种方法,都没有那么大:
- 滚你自己
Pair<A, B>
。你说你不想这样做。 - 返回一个
Object[]
。这不是安全的。 - 模仿输出变量或指针通过提供单个元素数组作为参数。
的#3的例子:
public boolean getUserDetails(String userId, String[] lastName, String[] firstName, Date[] dob) {
assert lastName != null && lastName.length == 1;
assert firstName != null && firstName.length == 1;
assert dob != null && dob.length == 1;
...
}
第三个选项使生活痛苦呼叫者。
所以就像我说的,没有很好的解决方案。另外,Scala使用各种各样的Tuple类(从我所记得的最多21个元组)来帮助你。
有人告诉我,专家认为,当面对对的问题,两件事情之一是真的:
- 你需要重新思考你的结构(这种生硬的回答并不能帮助任何人)
- 你需要建立你自己的班级来容纳这对
我会建议,第二种情况并不是所有的异常。但是,如果您正在做的事情对于引入一个新班级似乎太过简单,那么可以使用 ,正如其他人所建议的那样工作。如果你只是简单地发送一个单一的响应,那么Map
似乎有点多。
如果对的列表听起来像是可以工作的,并且您需要维护订单,则可以尝试LinkedHashMap
,以便维护订单。
如果你想滥用映射到返回对,为什么不使用AbstractMap的SimpleImmutableEntry? https://docs.oracle.com/javase/8/docs/api/java/util/AbstractMap.SimpleImmutableEntry.html 这是完全没有关于什么对的信息,以及它如何使用Map返回一对,除了你知道它只包含两个值。还有这个: https://docs.oracle.com/javase/8/javafx/api/javafx/util/Pair.html 如果你真的*想要使用一对。但我不同意这个直截了当的答案是无益的。它应该引发你至少问:“但是,为什么?”。 – 2017-08-11 10:08:20
一些观察我的:
数组储存卡式,快速,易于使用,虽然IMPOSIBLE扩大其产能。如果您希望3个月后返回3个值,该怎么办?
ArrayList /其他收集可以很好,允许您增加容量(最初10)。 请注意,与ArrayList相比,Vector只能在稍后存储两个值时才可以矫正。地图也可以很好,因为它总是被排序和排序。
某些用户定义的类:如果有意义(也就是说返回的数据很重要,可能是Java Bean),并且您希望将更多的整数存储在其中。如果您在其Javadoc中添加更多笔记,可读性会更好。可以随意扩展,只需在该类中添加字段即可。更慢,但更安全。
JavaFX中有一个类对象,但不应该使用它。你应该用的是这样的:
// We've skipped imports and package declarations
public final class YourClass {
/* Assume there is a bunch of stuff here */
// I don't know what method you're using, so forgive the silly example
public YourClass.Pair sillyExampleOfPairs(String someString) {
return new YourClass.Pair(someString, someString.length() * 13);
}
@Value // Lombok annotation.
public static class Pair {
String text;
int integer;
}
// this is an even more succinct possibility
@Value public static final class ShorterPair {String text; int integer}
}
虽然这里的名称对显然不是那么好选择,你应该选择一个更具描述性的名称,明显的方式,这将工作(字段是最后的私人和每个人都有一个吸气,因为注释)不应该在你身上丢失。当然,这比使用Pair稍微罗嗦一点,它更强大。如果你做需要增加一个额外的参数给返回值?你“只”需要改变这个类。你可以立即更新所有相关的JavaDoc,这也很好。如果你不得不改变类型,他们都需要类似的工作量。
只要你只是添加东西,旧的getText()和getInteger()方法将继续像以前一样工作。您也避免必须为您的项目添加另一个依赖项。这不是一个很大的胜利。拥有Pair可用于原型设计,但对于以后的设计来说并不好。
我最后的理论CS-Y论点是Pair与Pair相同。但是如果你有一个Phonebook.Entry(带有String和int)并且说,Inventory。项目(有一个名称和一些我们目前已经编目的项目),这两个是非常不同的类型,它们做非常独特的事情。你不能把其中一个放进去。这是一件好事。
这对我们来说也很清楚,因为我们这些可怜的混蛋必须去调试你的系统才能在堆栈跟踪中看到诸如“com.name.project.something.something.Phonebook.Entry”之类的东西,而不是“org.apache.commons .lang3.tuple.Pair”。其中一个告诉我,我应该看什么,并给我一些信息,为什么我看到一对。另一个说...没什么。
现在你可能并不在意,你必须输入3秒钟以节省3分钟。但我选择相信你内心的善良和你灵魂的高贵。因此,做正确的事情。
改写一个小静态类。
Java的方式_is_创建尽可能多的类:p(仅部分意味着作为一个笑话...) – 2011-06-07 21:18:13
另请参见相关但不同的主题http://stackoverflow.com/questions/457775/does-java-需要元组。 – 2011-06-07 21:19:00
相关:https://stackoverflow.com/questions/2832472/how-to-return-2-values-from-a-java-method – 2017-05-25 10:07:16