2017-07-28 73 views
3

我來自C編程背景。我想知道在返回值的地方編寫Java API的最佳方式是什麼,但這可能是無效的。什麼是可以接受的方法來編寫返回值可能無效的Java方法?

我有一個類實現了二叉搜索樹。它有一個方法getRootValue(),它返回根的值。

Ç代碼 -

boolean getRootValue(int *answer) { 
    if (root != null) { 
     *answer = value; 
     return TRUE; 
    } else { 
     return FALSE; 
    } 
} 

在用戶端,這是它的外觀喜歡 -

if (getRootValue(&answer)) { 
    //process valid answer 
} 

用戶調用這個函數會檢查返回,並只考慮answer是如果返回值爲TRUE,則有效。

Java框架代碼 -

package algorithm; 
class bst { 
    node root; 
    class node { 
     int value; 
     node left; 
     node right 
    } 

    //getRootValue() 
} 

用戶最終

package user; 
import algorithm.bst; 
... 
//bst.getRootValue(); 

在Java中,這將是(考慮到root用戶只知道BST而不是用戶),正確的方法是什麼?我們是否應該發送一個包含布爾值和答案的特殊類對象?如果是這樣,那麼應該在哪裏定義這個類?

有沒有不同的方法?對於我的BST課程實施,我應該有不同的想法嗎?

以前有問題詢問如何返回多個值。這不完全是我的問題。我想知道實現這種特殊情況的理想方式,這可能甚至可能不需要返回多個對象。

+0

使用接口將在這裏幫助 – Arvind

+1

除了通過@EJP你也可以考慮拋出一個異常,如果你收到惡意的用戶輸入給出了答案。這使得輸入和輸出免於兩個目的。 –

+0

C是一種將內存視爲一個大型數組的過程語言。 Java是一種內存管理語言,可以在對象方面發揮作用。你似乎在假設一種用一種語言工作的編程語言可以很容易地轉換爲另一種語言。這並不比你希望的更多。 – scottb

回答

2

我甚至不寫這個方法。沒有什麼特別的根源,你需要一個特定的方法來獲得它的價值。整個方法是多餘的。你需要一些東西來獲取根,並且你需要一些東西來從任何節點(以及它的左邊和右邊的孩子)中獲取值。

我會寫方法:

  1. Node Tree.getRoot()
  2. int Node.getValue()

你提到的例外情況是通過返回nullgetRoot(),其中主叫方可以很容易地檢測到滿足。

+0

當然,但我仍然對一個可能返回無效數據的方法的正確java函數簽名感到好奇......它會只返回null嗎? –

1

不知道這是否是絕對最好的方式來做到這一點,但在Java中,我會建議創建/使用異常。然後,用戶可以根據是否拋出異常來測試返回值是否有效。在用戶端

try{ 
    myVal = getRootValue(answer); 
}catch(Exception e){ 
    e.printStackTrace(); //There was an error here 
} 
+0

我會做同樣的事情,但不能用'Exception'。我會創建自己的異常類。 –

+0

@UsagiMiyamoto * I *會用適當的消息拋出'NullPointerException',但是我不會以這種方式寫它。 – EJP

+0

@EJP用NullPointerException編輯。這是一個好主意。 – Jaboyc

2

從Java 8

int getRootValue(int answer) throws Exception{ 
    if (root != null){ 
     return value; 
    }else{ 
     throw new NullPointerException("Root is null"); 
    } 
} 

,您可以使用Optional爲不確定答案回報。

Optional<Integer> getRootValue() { 
    return root != null ? Optional.of(value) : Optional.empty(); 
} 

然後客戶端代碼可以使用lambda表達式來處理值,如果存在的話,順暢。

getRootValue().ifPresent(value -> { 
    // process the value 
    System.out.println(value); 
}) 
+0

這個答案似乎符合問題的這一部分:「我們應該發送一個包含布爾值和答案的特殊類對象嗎?如果是,應該在哪裏定義這個類?」 –

+0

該類的限定名稱是java.util.Optional,它是Java Core的一部分。換一種說法,不確定(可選)結果自8年以來完全受Java支持。 –

相關問題