首页>Program>source

为什么没有一种(标准的,Java认证的)解决方案作为Java语言本身的一部分,可以从Java方法返回多个值,而不是开发人员必须使用自己的方法(例如Maps,Lists, 配对等? 为什么Java不支持n元组对象?

特别考虑琐碎的私有方法,这些方法可以一起修改两个对象(一前一后),在这种情况下,作为返回的类型化对象听起来过于杀伤。

最新回答
  • 2021-1-12
    1 #

    我认为OP的意思是"为什么 Java不支持n元组对象?"。 Python,Haskell,Lisp,ML等具有异构n元组功能.通常,在某种语言中显然可以返回多个对象的能力是语法上的糖(例如,在python中,返回'a','b')。

    当然的原因是语言设计和一致性. Java倾向于非常明确,不类似匿名数据结构(尽管我希望我们拥有匿名闭包)。

    例如,在Java中,没有办法说我想要一个接受这些类型参数并返回此参数的回调.有些人觉得这是一个巨大的弱点,其他人则类似一致性和明确性。

    恕我直言,尽管很烦人,但我经常通过制作静态内联类来解决这个问题:

    private static class Combo {
       String name;
       int weight;
    }
    

    是的,它很乏味,但是后来我经常重用和重构那些类,使它们成为顶级并增加行为.实际上,采用这种方法的优点之一是,在匿名数据结构(如FP语言)中添加新字段要容易得多,添加字段就变得困难得多(最终需要更改大量代码).

    我应该注意,某些人使用2元组使用(或滥用) java.util.Map.Entry 因为有一个 java.util.AbstractMap.SimpleEntry Java 6中也是如此。现在,有些人还使用Commons Lang3的Pair支持(2元组)。

    Scala通过作弊而具有n元组支持,并具有一大堆2-16元组接口,这是该语言的标准配置,并且在语法上对程序员而言是隐藏的.

    出于纯粹的教育原因,您可能希望了解其他语言如何做到这一点。

    UPDATE: for Java 8

    Java 8将(也许在这里,我的电话号码……也许叫我)支持称为 java.lang.BiValue的接口 可以使用称为 java.lang.BiVal的具体实现 .这些类是为了帮助支持新的lambda功能.但是请注意,这仅适用于2元组。

    UPDATE: for 2015

    Java 8并没有获得对元组的支持。

    UPDATE: from author 2015

    如果您仍然想要元组支持,那么有三个库很好地支持元组:

      javatuples - Supports JDK 5 and above. Up to 10-tuple.

      JOOλ - From the author of jOOQ but requires JDK 8.

      Commons Lang 3 - Now supports a Triple (3-tuple) and supports JDK 6 and above.

    p

    Java方法恰好返回零或一个值; 那 is Java的标准.如果需要返回多个值,请创建具有多个值的对象并将其返回。

  • 2021-1-12
    2 #

    如果要返回两个对象,通常需要返回一个封装了两个对象的单个对象。

  • 2021-1-12
    3 #

    p>

  • 2021-1-12
    4 #

    有很多方法可以做到这一点,一种方法是归还 Object[] ,但是您就需要担心索引了,而对空指针进行检查时,它变得很讨厌.另一种方法是返回 String ,但是您必须对其进行解析,然后它变得很讨厌.

    I think the real question is why?

    这很麻烦-如果我正在与您一起进行项目,并且看到了这种类型的行为,我将对其进行重写,以便您可以看到应该如何处理.如果您提供代码示例,我将对其进行重写以进行说明。

    用一种责任来编写您的方法,如果它们需要返回的数据超出其能力,则您可能应该使用一个对象,或将其分解为较小的方法。

  • 2021-1-12
    5 #

    因为返回 不推荐使用方法中的多值(在Java中).

    如果需要方法中不相关的值,则需要其他数据结构,例如包含这些值的对象.如果需要同一个类的多个实例(即几个String),则需要根据需要返回一个数组或某个集合.

    例如,使用其他语言返回多个值(例如Go)来返回错误代码,但是Java在设计上使用异常进行了不同的设计.

  • iphone:如何在iOS> = 421 Mobile Safari中自动播放媒体?
  • PHP表单将电子邮件发送给多个收件人