ブール値が設定されていない場所を知る必要がある場合 (たとえば、設定されていない値が親の値から継承する必要がある場合)、Java ブール値プリミティブ (および他の言語で同等のもの) は明らかに適切ではありません。
これを達成するためのベストプラクティスは何ですか? 3 つの状態すべてを表現できる新しい単純なクラスを定義するか、Java ブール値クラスを使用して null を使用して未設定の状態を示すか?
Boolean a = true;
Boolean b = false;
Boolean c = null;
私はそれを使用します。それは最も簡単です。
別の方法は、列挙を使用することです。ボクシングが必要ないので、おそらくそれはさらに良くて速いでしょう:
public enum ThreeState {
TRUE,
FALSE,
TRALSE
};
クラスのユーザーが 3 状態のブール値を気にする必要がないという最初の利点があります。彼らはまだ合格することができtrue
ますfalse
. が気に入らない場合はnull
、ここではその意味についてほとんど語っていないため、public static final Boolean tralse = null;
クラスで を作成できます。
Java 8 には、Optionalオプションもあります。
public static final Optional<Boolean> TRI_TRUE = Optional.of(true);
public static final Optional<Boolean> TRI_FALSE = Optional.of(false);
public static final Optional<Boolean> TRI_UNKNOWN = Optional.empty();
おまけとして、これらすべてのマップおよび消費メソッドを取得できます。
Java固有ではありませんが、このシナリオでの私自身の好みは、ThreeStateクラスまたは列挙を定義して使用することです-あなたが述べたように、True、False、およびUndefined(またはDefault、またはUnsetをドメイン固有として)用語が指示します)。で未設定/未定義を表すよりも、より自然で自己文書化されているように感じますnull
。
@NullableBoolean
は私の投票を取得します。
null を使用して何かの状態を表すことは、設計として不適切です。説明がつかず、維持するのが難しいです。何も明示的に設定されていない場合は、むしろデフォルト状態の State オブジェクトが必要です。例えば:
if(state == null) {
doSomething();
}
これは、期待される状態が何であるかについて何も教えてくれません。このようなものがより明確になります。
if(state.awaitingSet()) {
doSomething();
}
拡張性は言うまでもありません。4 番目の状態が必要な場合はどうなりますか?
場合によります。ここで、親の値から値を継承する必要がある場合は設定解除されると述べています。ある種のデータ階層はありますか? このようなもの:
Parent a {
boolean val = true;
boolean val2 = false;
}
Child b {
boolean val = false;
//here val2 should be unset!
}
この場合、可能であれば、Child に val2 を含めず、変数が見つからない場合は親で値を検索するようにルックアップ ロジックを設定します。
親クラスでブール値をnullに開始し、子クラスでメソッドを構築して、ブール値が設定されているかどうかを確認します
親クラスで
private Boolean a = null;
public void setA(Boolean a) {
this.a = a;
}
public Boolean getA() {
return a;
}
子クラスでは
if (a == true)
{
dothis;
}
else if (a == false)
{
dothat;
}
else
{
assert false : "Boolean a has not been set";
}
アサーションがオンになっていることを確認します。アサーションは開発サイクルとテスト サイクル専用であり、実行時例外用ではありません。
java.lang.Boolean がこれを行います。静的定数 Boolean.TRUE、Boolean.False があります。
プライベート ブール myBoolean;
Boolean.TRUE は同等性テストに合格しますが、「true」(TRUE に自動ボックス化されます) とは異なることに注意してください。