java.lang.Boolean は、Boolean.TRUE (該当する場合)、Boolean.FALSE (該当しない)、null (不明) の 3 つの状態を持つことができるため、三項論理を処理するのに最適です。どんな場合ですか)。switch ステートメントを使用してこれを処理するのは良い設計です。このコンストラクターで:
public class URN {
private String value = null;
public URN (String value, Boolean mode){
switch (mode){
case TRUE:
if(!isValidURN(value))
throw new MalformedURLException("The string could not be parsed.");
this.value = value;
break;
case FALSE:
this.value = value.concat(checkByteFor(value));
break;
case null:
if(isValidURN(value))
this.value = value;
else
this.value = value.concat(checkByteFor(value));
break;
}
return;
}
残念ながら、Java はそれを許可せず、「Boolean 型の値をオンにすることはできません」と不平を言っています。これを実装すると、難読化された制御フローと見栄えの悪いコードが生成されます。
public URN (String value, Boolean mode){
Boolean valid = null;
if (!Boolean.FALSE.equals(mode)){
valid = isValidURN(value);
if (Boolean.TRUE.equals(mode) && !valid)
throw new MalformedURLException("The string could not be parsed.");
if(Boolean.TRUE.equals(valid)) {
this.value = value;
return;
} }
this.value = value.concat(checkByteFor(value));
}
良い方法でそれを行うには、enum クラスを実装する必要があります (実際には、Trinary.NULL.equals(null) が true になるように .equals() を書き直す必要があるため、この例よりも複雑です) と変換:
private enum Trinary {TRUE, FALSE, NULL};
public URN (String value, Boolean toConvert, String x){
Trinary mode;
if(toConvert == null)
mode = Trinary.NULL;
else
mode = toConvert.equals(Boolean.TRUE) ? Trinary.TRUE : Trinary.FALSE;
switch (mode){
case TRUE:
if(!isValidURN(value)) throw new MalformedURLException("The string could not be parsed.");
this.value = value;
break;
case FALSE:
this.value = value.concat(checkByteFor(value));
break;
case NULL:
if(isValidURN(value))
this.value = value;
else
this.value = value.concat(checkByteFor(value));
break;
}
return;
}
私の目には、これはより読みやすい解決策であるため、より優れていますが、変換するだけのコードの元のメソッドサイズの残りの半分は面倒であり、実際には、同じセマンティックを持つ 2 つの異なる null に注意する必要があります。それを行うより良い方法はありますか?