2017-06-22 12 views
1

データをジェネリック型の配列<E>に格納していて、その配列のいくつかのセルを空としてマークする必要があります。 nullを使用することはできません。nullは空のセルと区別できる必要がある有効なエントリです。
この区別をする最善の方法は何ですか?私は"empty"セルのインデックスを含むリストのような他のデータ構造の使用を避けたいと思います。Javaジェネリック型EMPTY対ヌル

Object EMPTY = new Object(); 

、次に使用して、空のセルをマーク:限り私はインスタンスを作成できません知っている

array[emptyIndex] = EMPTY; 

を私は単にダミーのインスタンスを作成しObjectアレイの場合

の汎用タイプE"EMPTY"マーカーとして使用します。空のマーカーを作成する別の方法はありますか、それとも代替ソリューションがありますか?私の知る限り私も"EMPTY"マーカーとして使用するジェネリック型Eのインスタンスを作成することはできません知っているよう

+3

実際の値として「null」を使用することは全く危険であり、再考することをお勧めします。それにかかわらず、「オプション」を見てください。 –

+0

@ E_net4 'オプション'は 'null'を含むことはできません。 –

+3

'E '型は使用しませんが、あなたのニーズに実際に適したものです。 'E'をカプセル化するラッパークラスを記述したいかもしれません。 –

答えて

2

あなたは、このような下限の種類やそのClass対象として、Eについての情報がないと仮定すると、あなたは正しいです。インスタンスを作成することはできません。あなたは目的のためにあなたに1つを提供するようにユーザーに頼むことができますが、それは不便で潜在的に危険なようです。

空のマーカーを作成する別の方法がありますか、それとも別の解決方法がありますか?

実際に配列List必見 n列の配列Listこと場合、それはあなたが何の具体的な知識を持っていないかについての一般的な要素の型Eを持たなければならない場合は、あなたがにnull値を使用できない場合空の位置を表していれば、コーナーに自分自身を指定したことになります。何かが得なければならない。

いくつかの可能性が

  • 使用して、完全にマッピングされていないとしてMapIntegerとキーの代わりに NアレイList、モデル空の要素を含みます。次に、Map.contains()を使用して、指定されたインデックスが空の要素に対応するかどうかを判断できます。

  • 要素がEisEmptyのフラグなどを含むラッパータイプの要素を使用するListを使用します。

  • フラグなしのラッパーオブジェクトのListを使用してください。空の要素をnullとし、空でないnullの要素をとし、nullとします。

  • は、型の安全性を放棄し、あなたの「空の」オブジェクトとして配列Listに平野Objectを強制します。 Eに上限タイプのバインディングがない限り、実行時には問題ありません。

0

Javaでは、空のマーカーはありません。 多くの場合、空を示すためにnullが使用されます。

これはうまくいかないので、 あなた自身の空のマーカーを作成する必要があります。

あなたが言及しているテクニックは問題ありません。他の回答で説明したように最適なソリューションをラッパーをされて使用

public class Cell 
{ 
    private boolean empty; 
    private Object data; 

    public boolean isEmpty() 
    { 
     return empty; 
    } 

    public void setEmpty() 
    { 
     empty = true; 
    } 

    public void setNotEmpty() 
    { 
     empty = false; 
    } 

    // set and get data. 
} 
0

別の技術は、このような多くのセルクラスを定義しています。

EMPTYマーカーを使用していて、ラッパーやその他の/追加のデータ構造を使用したくない場合は、汚いトリックに頼らざるを得ません。
になる可能性がありますが、お勧めしません。

ユーザがデータ構造のコンストラクタに汎用タイプのclassを渡すようにします。これにより、EMPTYインスタンスに必要なタイプが取得されます。ただし、クラスをインスタンス化してサイト効果があるかどうかわからないため、リフレクションを使用してインスタンスを作成することはできません。この問題を解決するには、objenesisのようなライブラリを使用します。これはコンストラクタをバイパスし、副作用なしにオブジェクトをインスタンス化できます。

関連する問題