2016-11-09 42 views
-1

我用來初始化雙變量爲Double.NaN,稍後根據輸入進行填充。如果輸入錯誤,我只能返回Double.NaN。這種做法反其道而行之時,當其他部分的應用程序使用我的功能作爲輸入和工作就好了,做基本算術和比較NaNs與雙(但不應該,我希望例外)。在java中初始化雙變量的最安全的方法

明顯的解決辦法是在我的代碼的末尾添加Double.isNaN()並把我的功能 內異常但這是在高度優化的代碼使用頻率高的功能,所以我不願意增加額外的每個是時間檢查調用。我寧願每年一次在錯誤的參數上打破整個應用程序,而不是添加額外的檢查,尤其是,我聽說與NaN相比需要的時間比雙倍。我如何實現這一目標?在這種情況下,最佳實踐是什麼?

編輯 例如,我要返回參數函數的第一個參數,我一無所知根據用戶輸入

private double getFirstFactor(HashMap <String, Double> userParams) { 
    double res = Double.NaN; 
    if(userParams.containsKey("factor1")) { 
     res = userParams.get("factor1"); 
    } 
    return res; 
} 

使用

double f1 = getFirstFactor(userParams); 
double threshold = f(f1); // for example f1 * 100 + f1; 
// ideally, code above breaks if f1 is not defined and I don't go futher 
if(threshold >= 0) { 
... 
} else { 
... 
} 
+1

聽起來好像你的設計中有一些非常錯誤的東西。你需要顯示你的代碼,以及你如何初始化和使用變量,如果你想要任何建議。 – Kayaman

+0

使用''null''作爲Double的默認值有什麼問題?爲什麼是'NaN'' ?! – f1sh

+0

@ f1sh不是'雙','雙'。 – Kayaman

回答

3

不要那樣做。

NaN用於某些表達式的結果(例如0.0/0.0),並且具有其比較假與自身的獨特屬性

你應該總是初始化double值與明智的東西。根據你的算法,0.01.0通常是很好的價值。

如果你真的不能做到這一點,那麼你可以總是使用Double,與null爲默認初始化的值。

+0

我按要求添加了一個示例 如果我不知道輸入和可能的輸出使用情況,很難想出合理的。 – RInatM

+1

在這種情況下,您可能會使用'Double'和'null':查找從哈希映射不是特別便宜 - 儘管你的代碼是「高度優化」的抗議,瓶頸將永遠不會使用盒裝類型。 – Bathsheba

+0

只是試圖拿出一個簡單的例子(代碼中沒有Hashmaps) 哪個更好 - 使用Double或添加額外的檢查Double.isNaN? – RInatM

-1

使用盒裝類型Double並使用null作爲默認值Double.NaN。如果我需要堅持原語,我會得到0.0d作爲默認值。

+1

對於原始類型你不能這麼做,但對盒裝模擬器來說這是個好主意。 – Bathsheba

+0

@Bathsheba好吧,OP沒有說明他是否使用了primitve或者boxed類型,但是他強烈建議他使用boxed,因爲他想用'Double.NaN'。 – Antoniossss

+1

如果你用該評論澄清你的答案,downvoter(不是我)可能會收回。 – Bathsheba

1

在使用它們之前,您應該始終驗證您的輸入。如果您的輸入無效,則可以在完成任何計算之前投出IllegalArgumentException。它使調用者有責任使用正確的輸入代碼。

快速失敗總是更好,而不是在整個系統中傳播無效值。這可能會導致很大的問題(正如您可能遇到的那樣)。