2017-06-22 80 views
1

我正在將數據存儲在通用類型爲<E>的數組中,並且需要將該數組中的某些單元格標記爲空。我無法使用null,因爲null是需要與空單元格區分的有效條目。
做出這種區分的最佳方式是什麼?我想避免使用其他數據結構,例如包含"empty"單元索引的列表。Java泛型類型EMPTY vs null

在一個Object陣列I將簡單地創建一個虛擬實例的情況下:

Object EMPTY = new Object(); 

,然後標記空單元使用:

array[emptyIndex] = EMPTY; 

據我知道我不能創建一個實例通用類型E雖然被用作"EMPTY"標記。是否有另一種創建空白標記的方法或者是否有其他解決方案?

+3

使用'null'作爲實際值非常危險,建議您重新考慮。無論如何,看看'可選'。 –

+0

@ E_net4'Optional'不能包含'null'。 –

+3

請勿使用'E'類型,但實際上可以滿足您的需求。你可能想寫一個封裝'E'的封裝類。 –

回答

2

據我知道我不能創建通用的E型的實例時,雖然作爲"EMPTY"標記。

假設您有E沒有的信息,如結合較低的類型或它的Class對象,你是正確的。你不能創建一個實例。您可以要求用戶爲此提供一個給您,但這似乎既不方便也有潛在危險。

是否有另一種創建空標記的方法,或者是否存在其他解決方案?

如果陣列List實際上必須一個 N排列List,如果它必須具有一般元素類型E約你有沒有具體的知識,如果你不能使用null值代表空位,那麼你已經指定自己到了一個角落。有些事情必須付出。

一些可能性包括

  • 使用MapInteger鍵,而不是一個 N陣列List,並且如完全未映射模型空元素。然後,您可以使用Map.contains()來確定給定索引是否對應於一個空元素。

  • 使用List其元素是一些包裝類型包含EisEmpty標誌或類似。

  • 使用不帶標誌的包裝對象的List;將空元素表示爲null,將非空null元素表示爲包裝包含null

  • 放棄類型安全,並強制一個普通Object陣列List作爲「空」對象。只要E沒有上限類型的限制,在運行時應該沒問題。

0

在java中沒有空標記。 通常,null用於表示空。

因爲這不適合你,所以你需要創建你自己的空標記。

你提到的技術很好。

另一種技術是定義一個Cell類多這樣的:

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這樣的庫,它繞過了任何構造函數,並允許你實例化沒有副作用的對象。