210223 B book非整数定数列挙


昨日のサンプルコードに続いて、どのように改善するかをさらに理解します.
class CruiseControl { 
 static final int STOP_PRESET = 0;
 static final int PLANETARY_SPEED_PRESET = 1;
 static final int CRUISE_SPEED_PRESET = 2;
 
 static final int CRUISE_SPEED_KMH = 16994;
 static final int PLANETARY_SPEED_KMH = 7667;
 static final int STOP_SPEED_KMH = 0;
 
 private double targetSpeedKmh;
 
 void setPreset(int speedPreset) {
  if (speedPreset == CRUISE_SPEED_PRESET) {
   setTargetSpeedKmh(CRUISE_SPEED_KMH);
  } else if (speedPreset == PLANETARY_SPEED_PRESET) {
   setTargetSpeedKmh(PLANETARY_SPEED_KMH);
  } else if (speedPreset == STOP_PRESET) {
   setTargetSpeedKmh(STOP_SPEED_KMH);
  }
 }
 
 void setTargetSpeedKmh(double speed) {
  targetSpeedKmh = speed;
 }
}
昨日行ったように、定数はmagicnumberよりずっといいです.
ただし~すべてのオプションをリストできる場合、javaタイプシステムが提供する方法はずっと良いです.
上記のコードではspeedPresetは整数です.
すなわち、任意の整数値または負数はsetPreset()に入ることができる.
誰も私たちが定義した定数(STOP PRESETなど)を強制的に使用しません.
そして、無効な整数値を付けても、何も言わない.
無効な値を入力しても、エラーは投げ出されず、そのまま戻ります.
競合よりも優れていますが、これはエラー・タイプが発生する可能性があることを意味します.
Javaのような静的なタイプの言語は、これらのエラーをできるだけ早く発生させることができます.
実行前に発見された機能を提供します!!
エラーが早く見つかれば見つかるほど、修復のコストは低くなります.
class CruiseControl { 
 private double targetSpeedKmh;
 
 void setPreset(SpeedPreset speedPreset) {
  Object.requireNonNull(speedPreset);
  
  setTargetSpeedKmh(speedPreset.speedKmh);
 }
 
 void setTargetSpeedKmh(double speedKmh) {
  targetSpeedKmh = speedKmh;
 }
}

  enum SpeedPreset {
   STOP(0), PLANETARY_SPEED(7667), CRUISE_SPEED(16994);

   final double speedKmh;

   SpeedPreset(double speedKmh) {
    this.speedKmh = speedKmh;
   }
  }
}
まず対象です.requireNonNull(speedPreset); に参加
パラメータとして入力されたパラメータがnullでない場合は元に戻り、nullの場合はNull PointerException例外が生成されます.
上記のコードのように可能なすべてのオプションをリストできる場合は、整数ではなくenumタイプを常に使用することが望ましい.
ここで、SpeedPresetという新しいenumを作成します.
変数が追加されました.
主な利点は,存在しないSpeedPreset()メソッドを再利用できないことである.
また、数値ではなく意味のある名前で参照することもできます.
さらに、実際のターゲットであるSpeedKMHの定数もenumから除去されている.
最後にifelse文も削除できます.
=>(サンプルコードではenumがよく使われているのは知っていますが、コード全体の流れがよくわかりません.今はちょっと眠いからかも…;あるいはテキスト通りに見たのでそうなのか分かりませんが、明日もう一度見て、理解します.総じて、どんな内容なのか分かります.)
今日のコメント:わかりましたが、よくわからないことを学んでよかったです.