変数の欠落値を表すためにJavaで使用できるステートメントは何ですか。たとえば、コードを書きたいと思います。
if (a>=23)
income = pay_rate;
else
income is missing;
変数の欠落値を表すためにJavaで使用できるステートメントは何ですか。たとえば、コードを書きたいと思います。
if (a>=23)
income = pay_rate;
else
income is missing;
このスレッドには多くの悪いアドバイスがあります。最初に、提案されたアプローチのいくつかを採用すべきではない理由について説明させてください。
1. ラッパー型と null の使用
Integer income = null;
if (a >= 23) {
income = payRate;
}
Javaには自動アンボックスがあります。income
Java が自動アンボックスしなければならない場所で誤って使用した場合はどうなりますか? コンパイラはこのエラーをキャッチできず、コードは実行時に失敗します。
第 2 に、収入の「nullability」はincome
の型の一部ではありません。その結果、使用するnull
たびにチェックするように注意するのはプログラマ次第です。彼がこのチェックを実行するのを忘れた場合、コンパイラは文句を言いませんが、NullPointerException
実行時に s が返されます。
2. センチネル値を使用して例外的な条件を示す
int income = Integer.MAX_VALUE;
if (a >= 23) {
income = payRate;
}
このアプローチには、アプローチの 2 番目の欠点がありnull
ます。さらに悪いことに、この場合、例外をスローする代わりに、が有効であるため、誤った条件でも計算が続行され、悲惨な結果が生じる可能性があります。Integer.MAX_VALUE
int
では、これにどのように対処すればよいでしょうか。
次のデータ型を使用します。
Maybe
(としても知られていますOption
) 法案に適合します。(@Bahribayli は既にこれを提案しています。私はそれを拡張しています。)ここのデータ定義を参照してください。
そして、これはあなたの場合にそれをどのように使用するかです:
Maybe<Integer> income = Nothing.value();
if (a >= 23) {
income = Just.of(payRate);
}
この抽象化を提供するFunctional Javaという名前のライブラリがあります。このデータ型の使用に関してさらに質問がある場合は、喜んでお答えします。
ステートメントではなく値を探しています。その値はです。やなどのプリミティブデータ型の変数に割り当てることはできませんが、ボックス化された対応する変数、、などで使用できます。null
null
int
double
Integer
Double
null
これを行うときは、値にアクセスする前に値を確認するように注意する必要があります。そうしないと、無実に見えるif (pay_rate > 100)
ものがnull参照例外をスローする可能性があります。
Option
型理論における型は、意味のある値を持つかどうかわからない変数の型を指定する方法です。一部の言語Option
は、Scala のscala.Option
型のような型をサポートしています。タイプをサポートしない言語の場合は、ラッパー クラスまたはボックス化された対応するプリミティブを使用できます。
public class Income {
private int value;
public Income(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
...
Income income = null;
if( a >= 23)
income = new Income(pay_rate);
または単に
Integer income = null;
if( a >= 23)
income = pay_rate;
Integer income = null;
if (a >= 23) {
income = payRate; // underscores are generally considered bad convention in Java
}
収入をnullに設定できます。後で、収入の値をチェックするときに、それがnullの場合、それを行方不明として扱うよりも
Integer income = a>=53?pay_rate:null;
Double income = null;
if (a>=23) {income = pay_rate; }
収入はnull
デフォルトであるため、初期化されていない場合
スローを使用します。
if (a>=23)
income = pay_rate;
else
throw new IllegalArgumentException("income is missing");
他の ans here で述べたように、ボックス型を使用できます。ただし、データの有効な値を探し、欠落している無効な値を選択することをお勧めします。あなたの特定の収入のケースでは、負になることはないので、-1 を選択できます。
boxed 型を避ける理由はパフォーマンスです。私はそれらを使用することに反対していませんが、それらなしで作業できる場合は、それらを使用する必要はありません.
+ve 値と -ve 値のほとんどが有効な値である場合は、またはのいずれInteger.MAX_VALUE
かInteger.MIN_VALUE
を欠損値として使用します。使用可能なすべての値の範囲の 1 つの値を失うだけです。
注: 自動ボクシング (プリミティブ型からボックス型への暗黙的な変換、およびその逆の変換) は優れた機能ですが、デバッグや検出が困難なパフォーマンスの問題を引き起こす可能性があります。
で変数を初期化する必要がありますnull
Double income = null;
if (a>=23)
{
income = pay_rate;
}
あなたもこれを試すことができます。おそらく私がやりたい方法ですが、あなた次第です:p
if(a >= 23){
income = payRate;
} else{
income = null;
}
null
デフォルトで設定するのではなく、何がnull
何であるかを確認した後に設定しますa
。また、収入が または のいずれかであることを確認してくださいInteger
。Double