booleanをflagとして使用する場合はenumを使用します.




chessタスクでは、絶対値で計算するか単純に計算するかを指定する論理が必要なのでbooleanタグを使用します.
しかし、boolean値を使うのはflagのような良い方法ではなく、enumによって管理されているというコメントがあります.
Prefer enums over booleans
上記の内容をもう少し緩めて整理してみましょう.

boolean flagでの問題


1.二分法でしか表現できない。

public void addItem(final Item item, final boolean deliveryComplete) {
		
}
出荷が完了すると、納品完了はtrue、出荷が完了しない場合はfalseになります.
ただし、出荷ステータスが「出荷済」、「出荷中」、「出荷準備中」、「出荷中」などの複数のステータスに変更された場合は、どうすればいいですか?以下に実施しますか?
public void addItem(final Item item, 
					final boolean deliveryComplete, 
					final boolean isDelivering) {
		
}
上記に比べてenumを用いた管理は,ニーズの変更に柔軟に対応できる.
public enum DeliveryState {
		COMPLETE,
		DELIVERING,
		//RELAESING,
		//ORDER_ACCEPTING, 필요할 때 마다 추가
		;
}

2.曖昧な解釈が生じる。

public void addItem(final Item item, final boolean deliveryComplete) {
		
}
もしdeliveryCompleteがfalseだったら、どんな状態になりますか?注文を受けていますか?出庫処理中?配送中?
このようにbooleanタグは二分法の表現であるため,多くの種類に解釈できる.

3.ミスを誘発する。

public void addItem(final Item item, 
					final boolean deliveryComplete, 
					final boolean isClothes) {
		
}
前述したように、ブールタグを使用する方法は2つあります.
addItem(new Item(), false, true); // 배송되지 않은 옷
上記の構成では、開発者がミスを犯すことができます(?)和弦です.下図に示すように、開発者がboolean変数の順序を誤って変更した場合、深刻なエラーが発生します.
addItem(new Item(), true, false); // 배송된 옷이 아닌
しかし、enumで表すと、
public void addItem(final Item item, 
					final DeliveryState deliveryState, 
					final ItemKind itemKind) {
		
}
addItem(new Item(), DeliveryState.COMPLETE, ItemKind.CLOTHES);
//아래와 같이 컴파일 에러가 발생하기 때문에 실수할 여지가 없다.
addItem(new Item(), ItemKind.CLOTHES, DeliveryState.COMPLETE);

4.enumに比べて毒性が低い。

addItem(new Item(), true);
//vs
addItem(new Item(), DeliveryState.COMPLETE);