11

変数の欠落値を表すためにJavaで使用できるステートメントは何ですか。たとえば、コードを書きたいと思います。

if (a>=23)
 income = pay_rate;
else 
 income is missing;
4

11 に答える 11

14

このスレッドには多くの悪いアドバイスがあります。最初に、提案されたアプローチのいくつかを採用すべきではない理由について説明させてください。

1. ラッパー型と null の使用

Integer income = null;
if (a >= 23) {
  income = payRate; 
}

Javaには自動アンボックスがあります。incomeJava が自動アンボックスしなければならない場所で誤って使用した場合はどうなりますか? コンパイラはこのエラーをキャッチできず、コードは実行時に失敗します。

第 2 に、収入の「nullability」はincomeの型の一部ではありません。その結果、使用するnullたびにチェックするように注意するのはプログラマ次第です。彼がこのチェックを実行するのを忘れた場合、コンパイラは文句を言いませんが、NullPointerException実行時に s が返されます。

2. センチネル値を使用して例外的な条件を示す

int income = Integer.MAX_VALUE;
if (a >= 23) {
  income = payRate;
}

このアプローチには、アプローチの 2 番目の欠点がありnullます。さらに悪いことに、この場合、例外をスローする代わりに、が有効であるため、誤った条件でも計算が続行され、悲惨な結果が生じる可能性があります。Integer.MAX_VALUEint


では、これにどのように対処すればよいでしょうか。

次のデータ型を使用します。

  • その型で表現される「null可能性」があります。
  • 上記の 2 つのアプローチのような条件付きチェックは必要ありません。
  • コンパイル時に、データが不正な状態でアクセスされていないことを保証します。

Maybe(としても知られていますOption) 法案に適合します。(@Bahribayli は既にこれを提案しています。私はそれを拡張しています。)ここのデータ定義を参照してください。

そして、これはあなたの場合にそれをどのように使用するかです:

Maybe<Integer> income = Nothing.value();
if (a >= 23) {
  income = Just.of(payRate);
}

この抽象化を提供するFunctional Javaという名前のライブラリがあります。このデータ型の使用に関してさらに質問がある場合は、喜んでお答えします。

于 2012-06-03T12:19:02.007 に答える
6

ステートメントではなくを探しています。その値はです。やなどのプリミティブデータ型の変数に割り当てることはできませんが、ボックス化された対応する変数、、などで使用できます。nullnullintdoubleIntegerDouble

nullこれを行うときは、値にアクセスする前に値を確認するように注意する必要があります。そうしないと、無実に見えるif (pay_rate > 100)ものがnull参照例外をスローする可能性があります。

于 2012-05-30T04:54:24.563 に答える
3

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;
于 2012-05-30T05:04:39.610 に答える
2
Integer income = null;
if (a >= 23) {
  income = payRate; // underscores are generally considered bad convention in Java
}
于 2012-05-30T04:54:13.937 に答える
2

収入をnullに設定できます。後で、収入の値をチェックするときに、それがnullの場合、それを行方不明として扱うよりも

Integer income = a>=53?pay_rate:null;
于 2012-05-30T04:54:14.387 に答える
2
Double income = null;
if (a>=23) {income = pay_rate; }

収入はnullデフォルトであるため、初期化されていない場合

于 2012-05-30T04:54:40.603 に答える
2

スローを使用します。

if (a>=23)
    income = pay_rate;
else 
    throw new IllegalArgumentException("income is missing");
于 2012-05-30T05:19:58.517 に答える
2

他の ans here で述べたように、ボックス型を使用できます。ただし、データの有効な値を探し、欠落している無効な値を選択することをお勧めします。あなたの特定の収入のケースでは、負になることはないので、-1 を選択できます。

boxed 型を避ける理由はパフォーマンスです。私はそれらを使用することに反対していませんが、それらなしで作業できる場合は、それらを使用する必要はありません.

+ve 値と -ve 値のほとんどが有効な値である場合は、またはのいずれInteger.MAX_VALUEInteger.MIN_VALUEを欠損値として使用します。使用可能なすべての値の範囲の 1 つの値を失うだけです。

注: 自動ボクシング (プリミティブ型からボックス型への暗黙的な変換、およびその逆の変換) は優れた機能ですが、デバッグや検出が困難なパフォーマンスの問題を引き起こす可能性があります。

于 2012-05-30T05:14:03.490 に答える
0

で変数を初期化する必要がありますnull

Double income = null;
if (a>=23) 
{
   income = pay_rate; 
}
于 2012-05-30T12:00:47.020 に答える
0

あなたもこれを試すことができます。おそらく私がやりたい方法ですが、あなた次第です:p

if(a >= 23){
    income = payRate;
} else{
    income = null;
}

nullデフォルトで設定するのではなく、何がnull何であるかを確認した後に設定しますa。また、収入が または のいずれかであることを確認してくださいIntegerDouble

于 2012-05-30T05:06:18.687 に答える