2017-06-22 3 views
1

Ich speichere Daten in einem Array des generischen Typs <E> und muss einige Zellen in diesem Array als leer markieren. Ich kann null nicht verwenden, da null ein gültiger Eintrag ist, der von einer leeren Zelle unterscheidbar sein muss.
Was ist der beste Weg, um diese Unterscheidung zu machen? Ich möchte vermeiden, andere Datenstrukturen wie eine Liste zu verwenden, die die Indizes von "empty" Zellen enthält.Java generischer Typ EMPTY vs null

Im Falle eines Object Array ich einfach eine Dummy-Instanz erstellen würde:

Object EMPTY = new Object(); 

und dann markieren leere Zellen mit: I eine Instanz nicht erstellen

array[emptyIndex] = EMPTY; 

Soweit ich weiß, von generischen Typ E als ein "EMPTY" Marker verwendet werden, obwohl. Gibt es eine andere Möglichkeit, einen leeren Marker zu erstellen, oder gibt es alternative Lösungen?

+3

Die Verwendung von 'Null' als tatsächliche Werte ist äußerst gefährlich, und es wird empfohlen, dies zu überdenken. Unabhängig davon, schauen Sie sich 'Optional' an. –

+0

@ E_net4 'Optional' kann nicht' null' enthalten. –

+3

Verwenden Sie nicht den Typ'E, sondern etwas, das tatsächlich für Ihre Bedürfnisse geeignet ist. Vielleicht möchten Sie eine Wrapper-Klasse schreiben, die 'E' einkapselt. –

Antwort

2

Soweit ich weiß, dass ich nicht eine Instanz von generischem Typ E als "EMPTY" Marker schaffen, obwohl verwendet.

der Annahme, dass Sie keine Informationen über E, wie zum Beispiel eine niedrigere Art haben gebunden oder seine Class Objekt, sind Sie richtig. Sie können keine Instanz erstellen. Sie könnten den Benutzer bitten, Ihnen einen zu diesem Zweck zur Verfügung zu stellen, aber das erscheint sowohl unpraktisch als auch potentiell gefährlich.

Gibt es eine andere Möglichkeit, einen leeren Marker zu erstellen, oder gibt es alternative Lösungen?

Wenn die ArrayList muss in der Tat sein ein n ArrayList, und wenn es generische Elementtyp haben muss E über die Sie keine spezifischen Kenntnisse haben, und wenn Sie nicht null Werte verwenden, um Stellen Sie leere Positionen dar, dann haben Sie sich in einer Ecke festgelegt. Etwas muss geben.

Einige Möglichkeiten sind

  • verwenden, um eine Map mit Integer Schlüssel anstelle einer n ArrayList, und das Modell vollständig leere Elemente wie unmapped. Dann können Sie Map.contains() verwenden, um festzustellen, ob ein bestimmter Index einem leeren Element entspricht.

  • Verwenden a List deren Elemente eines Typs wrapper eine E und ein isEmpty Flag oder ähnliches enthält.

  • Verwenden Sie eine List Wrapper-Objekte ohne Flag; stellen leere Elemente wie null und nicht leere null Elemente als Wrapper dar, dienull enthalten.

  • Typsicherheit verlassen und zwingen, eine ebene Object in das Array List als „Empty“ Objekt. Das sollte zur Laufzeit in Ordnung sein, solange E keinen oberen Typ gebunden hat.

0

In Java gibt es keine leere Markierung. Oft wird null verwendet, um leer anzuzeigen.

Da dies nicht für Sie funktioniert, müssen Sie Ihre eigenen leeren Marker erstellen.

Die Technik, die Sie erwähnen, ist in Ordnung.

Eine andere Technik ist es, eine Zellklasse viel wie folgt definieren:

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

einen Wrapper verwenden, wie in der anderen Antwort beschrieben wird, um die beste Lösung.

Wenn Sie den Marker EMPTY verwenden und absolut keine Wrapper oder andere/zusätzliche Datenstrukturen verwenden wollen, müssen Sie auf einige schmutzige Tricks zurückgreifen.
Sie könnte Folgendes tun, aber ich würde es nicht empfehlen.

Lassen Sie den Benutzer den class des generischen Typs im Konstruktor Ihrer Datenstruktur übergeben. Auf diese Weise erhalten Sie den Typ, den Sie für Ihre EMPTY Instanz benötigen. Sie können eine Instanz jedoch nicht einfach mithilfe von Reflexionen erstellen, da Sie nicht wissen, ob die Instanziierung der Klasse Site-Effekte aufweist. Um dieses Problem zu lösen, können Sie eine Bibliothek wie objenesis verwenden, die alle Konstruktoren umgeht und es Ihnen ermöglicht, Objekte ohne Nebenwirkungen zu instanziieren.