210223 B book非整数定数列挙
昨日のサンプルコードに続いて、どのように改善するかをさらに理解します.
ただし~すべてのオプションをリストできる場合、javaタイプシステムが提供する方法はずっと良いです.
上記のコードではspeedPresetは整数です.
すなわち、任意の整数値または負数はsetPreset()に入ることができる.
誰も私たちが定義した定数(STOP PRESETなど)を強制的に使用しません.
そして、無効な整数値を付けても、何も言わない.
無効な値を入力しても、エラーは投げ出されず、そのまま戻ります.
競合よりも優れていますが、これはエラー・タイプが発生する可能性があることを意味します.
Javaのような静的なタイプの言語は、これらのエラーをできるだけ早く発生させることができます.
実行前に発見された機能を提供します!!
エラーが早く見つかれば見つかるほど、修復のコストは低くなります.
パラメータとして入力されたパラメータがnullでない場合は元に戻り、nullの場合はNull PointerException例外が生成されます.
上記のコードのように可能なすべてのオプションをリストできる場合は、整数ではなくenumタイプを常に使用することが望ましい.
ここで、SpeedPresetという新しいenumを作成します.
変数が追加されました.
主な利点は,存在しないSpeedPreset()メソッドを再利用できないことである.
また、数値ではなく意味のある名前で参照することもできます.
さらに、実際のターゲットであるSpeedKMHの定数もenumから除去されている.
最後にifelse文も削除できます.
=>(サンプルコードではenumがよく使われているのは知っていますが、コード全体の流れがよくわかりません.今はちょっと眠いからかも…;あるいはテキスト通りに見たのでそうなのか分かりませんが、明日もう一度見て、理解します.総じて、どんな内容なのか分かります.)
今日のコメント:わかりましたが、よくわからないことを学んでよかったです.
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がよく使われているのは知っていますが、コード全体の流れがよくわかりません.今はちょっと眠いからかも…;あるいはテキスト通りに見たのでそうなのか分かりませんが、明日もう一度見て、理解します.総じて、どんな内容なのか分かります.)
今日のコメント:わかりましたが、よくわからないことを学んでよかったです.
Reference
この問題について(210223 B book非整数定数列挙), 我々は、より多くの情報をここで見つけました https://velog.io/@jeong-jaehyeon/210223B책정수-상수-대신-열거형テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol