2017-06-22 115 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这样的库,它绕过了任何构造函数,并允许你实例化没有副作用的对象。