2016-11-09 10 views
-1

double変数をDouble.NaNで初期化し、入力に応じて後で入力することがありました。入力に間違いがあった場合は、ちょうどDouble.NaNを返します。この練習は、アプリケーションの他の部分が自分の関数を入力として使用してOKを実行し、基本的な算術演算を行い、doubleとNaNsを比較すると逆行しました(しかし例外ではありませんでした。Javaでdouble変数を初期化するもっとも安全な方法

明白な解決策は、私のコードの末尾にDouble.isNaN()を追加して、私の機能 内で例外をスローするだろう。しかし、これは、高度に最適化されたコードでは非常に使用する関数ですので、私はそれがあるたびにチェックし、余分なを追加したくありませんよと呼ばれる。むしろ、余分なチェックを追加するよりも、年に一度間違ったパラメータでアプリケーション全体を中断することを好むでしょう。 NaNと比較すると2倍に比べて時間がかかります。どのように私はそれを達成し、この状況でベストプラクティスは何ですか?

EDIT例えば 、私は、ユーザー入力に

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

'' Double''のデフォルト値として '' null''を使うとどうなりますか?なぜ「ナナ」? – f1sh

+0

@ f1sh「ダブル」、「ダブル」ではありません。 – Kayaman

答えて

3

はそれをしないでください

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

使用状況に依存について何も知らないパラメトリック機能のための最初のパラメータを返すようにしたいです。

NaNは、特定の式(例:0.0/0.0)の結果に使用され、ユニークというプロパティを持ち、falseと比較します。

常にの初期値doubleの値は意味があります。アルゴリズムによっては、0.01.0が良い値になることがよくあります。

あなた本当には、常にあなたのデフォルト-初期化値としてnullで、Doubleを使用することができることを行うことができない場合。

+0

私は要求通りに例を追加しました 入力と出力の可能な使用法がわからない場合、感覚的に思いつくのは難しいです。 – RInatM

+1

'Double'と' null'を使うかもしれません:ハッシュマップからは特に安いわけではありません。ボトルネックは、このコードが「高度に最適化されている」という抗議行動にもかかわらず、箱入りタイプを使用することはありません。 – Bathsheba

+0

は、Doubleを使用するか、Double.isNaNチェックを追加して、より良い - 単純な例(コード内にハッシュマップなし)を出そうとしました。 ? – RInatM

-1

Doubleを使用し、nullをデフォルト値のDouble.NaNとして使用してください。プリミティブに固執する必要がある場合は、デフォルト値として0.0dを取得します。

+1

これはプリミティブ型ではできませんが、ボックス化されたアナログでは良い考えです。 – Bathsheba

+0

@Bathshebaまあ、OPはprimitveやboxedの型を使用しているのかどうかを指定していませんが、Double.NaNを使用したいのでboxedを使用することを強くお勧めします。 – Antoniossss

+1

あなたがそのコメントであなたの答えを明確にすると、下降者(私ではない)が後退する可能性があります。 – Bathsheba

1

入力を使用する前に、常に入力を検証する必要があります。入力が無効な場合は、計算が完了する前にIllegalArgumentExceptionを投げることができます。正しい入力を使用してコードを使用することは、呼び出し元の責任です。

無効な値をシステム全体に伝播する代わりに、常に高速に処理する方がよい場合があります。これは、おそらく経験したように大きな問題を引き起こす可能性があります。

関連する問題