2011-10-24 5 views
2

XMLファイルからデータをインポートして内部的に使用します。今はuint値がありますが、これは必須ではありません(XSDによる)。どのように私のクラスでは、この動作をマッピングします(値が存在するかどうかは、不明であるが、私は、実行時に知っておく必要があります)オプションのクラスメンバー

基本的に私は3つのソリューションを参照してください:

ソリューションを今ここで質問です1:

public class Solution1 { 
    private int optionalVal; 

    public boolean isSetOptionalVal() { 
     return (optionalVal>=0); 
    } 

    public void setOptionalVal(int val) { 
     optionalVal = val; 
    } 

    public void unSetOptionalVal() { 
     optionalVal = -1; 
    } 

    public int optionalVal() { 
     if(isSetOptionalVal()) { 
      return optionalVal; 
     } else { 
      return -1; 
     } 
    } 
} 

解決方法2:使用値は、その私たちは「-設定されていない」として、彼らはフラグの値に無効であることを知っている箱入りのクラスを使用して値が「ではない、設定されている場合nullに設定します「:

public class Solution2 { 
    private Integer optionalVal; 

    public boolean isSetOptionalVal() { 
     return (optionalVal!=null); 
    } 

    public void setOptionalVal(int val) { 
     optionalVal = val; 
    } 

    public void unSetOptionalVal() { 
     optionalVal = null; 
    } 

    public int optionalVal() { 
     if(isSetOptionalVal()) { 
      return optionalVal; 
     } else { 
      return -1; 
     } 
    } 
} 

解決策3:これらの問題を解決するために私の提案ですが、私は本当にそれらのいずれか好きではない

public class Solution3 { 
    private int optionalVal; 
    private boolean optionalValSet; 

    public boolean isSetOptionalVal() { 
     return (optionalValSet); 
    } 

    public void setOptionalVal(int val) { 
     optionalVal = val; 
     optionalValSet = true; 
    } 

    public void unSetOptionalVal() { 
     optionalValSet = false; 
    } 

    public int optionalVal() { 
     if(isSetOptionalVal()) { 
      return optionalVal; 
     } else { 
      return -1; 
     } 
    } 
} 

:「-設定されていない」として値を記述し、追加の変数を使用してください。

ソリューション1は、多分私は、無効な値を判断できない点がどこかにあり、非常にハックようです。

解決策2は実際には私が使用している解決策ですが、メンバ変数のいくつかについては追加情報が必要なだけなので、いくつかの変数をボックス型として使用したり、プリミティブ(矛盾しているようです) (私は本当に好きではない)ボックス型を常に使用している。

解決策3は最もクリーンなようですが、ここで私はいくつかの場所でブールが正しく設定されていないと心配しています。これはエラーを見つけるのが難しいでしょう(私はすでに多くのコードを持っていますいくつかの要素がちょうど最近、XMLに設定されていないことを問題、)

そう...あなたは「オプションバリュー」-problemを解決するためのソリューションとして何を好むだろうが - 多分よりよい解決策がありますか? この問題は一般にどのように処理されますか?

+1

メモ: "inconsisten":異なる動作/定義を持つ変数が一貫しているように見えるのはなぜですか?いくつかの値が 'null'であり、他の値がそうでない場合、それらは異なって見えるべきです。 –

+1

私は/私はまだ変数の異なる使用について懸念していた。矛盾することによって、正しい比較メソッドをどこでも使用するようにしなければならないと言いました( '=='はボックス型を比較す​​ることができません)。 –

答えて

5

私は、Integerクラスを使用して、オプション2を選択し、オートボクシングにint型と整数間の変換を残すだろう。この方法の利点は、オプションの値に関係するすべてのものを1つの変数に保持することです。

最初のオプションは、マジック値であり、未使用の値は、後に使用される値になった場合、それは維持するために悪夢になります。

第三の選択肢は、int型と、それが使用されているかどうかという問題を追跡ブールの両方を追跡するために有することを意味します。これを行うつもりなら、クラスをそれ自身のクラスにすることを検討してください。しかしIntegerを使うこともできます。

3

解決策2ははるかにクリーンです。これはまさにnullのためのもので、いくつかの値にはプリミティブ型を使用し、他のものにはラッパー型を使用して、違いがあることを伝えます。

2

私もソリューション2を好むでしょうが、それは一般的にも同様です。

あなたのgetters/settersはそれを反映する必要があります。すでにオプションの値が設定されているかどうかの指標としてnullを持っているので、私はないと思います

public void setOptionalVal(Integer val) { 
    optionalVal = val; 
} 

public Integer optionalVal() { 
    return optionalVal; 
} 

:彼らは(実際の場合、あなたのコード内ではなく、あなたのポスト内であるかもしれない)、次のようになります別の値を導入してください(あなたの場合は-1)。そのオブジェクトのユーザーに依存する可能性の高いデフォルト値が必要な場合

+0

実際には、値はストアされ、内部的にしか使われないので、セッターとゲッターは使用しませんが、私はその考えを得ています。 –

関連する問題