首頁>Program>source

為什麼没有一種(標準的,Java认證的)解決方案作為Java語言本身的一部分,可以从Java方法返迴多个值,而不是開發人員必须使用自己的方法(例如Maps,Lists, 配對等? 為什麼Java不支援n元組物件?

特別考虑琐碎的私有方法,這些方法可以一起修改两个物件(一前一後),在這種情况下,作為返迴的型別化物件听起来過於杀伤。

最新回復
  • 5月前
    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的標準.如果需要返迴多个值,請建立具有多个值的物件並將其返迴。

  • 5月前
    2 #

    如果要返迴两个物件,通常需要返迴一个封裝了两个物件的單个物件。

  • 5月前
    3 #

    p>

  • 5月前
    4 #

    有很多方法可以做到這一點,一種方法是归還 Object[] ,但是您就需要担心索引了,而對空指標进行檢查時,它變得很讨厌.另一種方法是返迴 String ,但是您必须對其进行解析,然後它變得很讨厌.

    I think the real question is why?

    這很麻煩-如果我正在与您一起进行專案,並且看到了這種型別的行為,我將對其进行重寫,以便您可以看到應该如何處理.如果您提供代碼示例,我將對其进行重寫以进行說明。

    用一種责任来編寫您的方法,如果它们需要返迴的資料超出其能力,則您可能應该使用一个物件,或將其分解為较小的方法。

  • 5月前
    5 #

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

    如果需要方法中不相關的值,則需要其他資料結構,例如包含這些值的物件.如果需要同一个類的多个例項(即几个String),則需要根据需要返迴一个陣列或某个集合.

    例如,使用其他語言返迴多个值(例如Go)来返迴錯誤代碼,但是Java在設計上使用異常进行了不同的設計.

  • iphone:如何在iOS> = 421 Mobile Safari中自動播放媒體?
  • PHP表單將電子郵件發送给多个收件人