2009-03-17 8 views
6

Beachten Sie, dass ich hier eigentlich nichts mit einer Datenbank mache, also sind ORM-Tools wahrscheinlich nicht das, wonach ich suche.Gibt es eine Java Collection (oder eine ähnliche), die sich wie eine SQL-Tabelle mit automatischer ID verhält?

Ich möchte einige Container haben, die jeweils eine Anzahl von Objekten enthalten, wobei alle Objekte in einem Container derselben Klasse angehören. Der Container sollte etwas von dem Verhalten einer Datenbanktabelle zeigen, nämlich:

  • kann eines der Objektfelder als eindeutiger Schlüssel verwendet werden, d. e. andere Objekte, die in diesem Feld denselben Wert haben, werden dem Container nicht hinzugefügt.
  • Beim Akzeptieren eines neuen Objekts sollte der Container eine numerische ID ausgeben, die an den Aufrufer der Einfügemethode zurückgegeben wird.
  • Statt einen Fehler zu werfen, wenn ein "doppelter Eintrag" angefordert wird, sollte der Container die Einfügung überspringen und den Schlüssel des bereits vorhandenen Objekts zurückgeben.

    Jetzt würde ich eine generische Containerklasse schreiben, die Objekte akzeptiert, die eine Schnittstelle implementieren, um den Wert des Schlüsselfelds abzurufen, und eine mit diesen Werten codierte HashMap als tatsächliche Speicherklasse verwenden. Gibt es einen besseren Ansatz mit vorhandenen integrierten Klassen? Ich schaute durch HashSet und dergleichen, aber sie schienen nicht zu passen.

    Antwort

    4

    Keiner der Collections-Klassen wird tun, was Sie brauchen. Sie müssen Ihre eigenen schreiben!

    P.S. Sie müssen auch entscheiden, ob Ihre Klasse Thread-sicher ist oder nicht.

    P.P.S. ConcurrentHashMap ist in der Nähe, aber nicht genau das Gleiche. Wenn Sie eine Unterklasse erstellen oder umbrechen oder die Objekte umbrechen können, die in Ihre Map eingegeben werden, sodass Sie nur auf diese Klasse für die Thread-Sicherheit angewiesen sind, verfügen Sie über eine effiziente und threadsichere Implementierung.

    1

    Ich dachte, Sie könnten es mit ArrayList tun, die aktuelle Position im Array als die "ID" verwenden, aber das hindert Sie nicht daran, eine Einfügung an einer vorhandenen Position vorzunehmen, plus wenn Sie an dieser Stelle einfügen Es wird alles nach oben bringen. Aber Sie können Ihre eigene Klasse auf ArrayList basieren und den aktuellen Wert von .size() nach einem .add zurückgeben.

    3

    Sie können dieses Verhalten mit einer HashSet simulieren. Wenn die Objekte, die Sie der Sammlung hinzufügen, über ein Feld verfügen, das Sie als eindeutige ID verwenden können, muss dieses Feld von der hashCode() -Methode des Objekts zurückgegeben werden (oder verwenden Sie einen calculated hash code-Wert, so oder so).

    HashSet wird keinen Fehler auslösen, wenn Sie einen doppelten Eintrag add, es gibt nur false zurück. Sie können HashSet so umbrechen (oder erweitern), dass Ihre add-Methode die eindeutige ID zurückgibt, die Sie als Rückgabewert verwenden möchten.

    1

    Gibt es einen Grund, warum der Hash-Code des Objekts nicht als "numerische ID" verwendet werden kann? Wenn nicht, müssen Sie den Aufruf nur in eine ConcurrentHashMap umbrechen, den Hashcode des Objekts zurückgeben und die Methode putIfAbsent (K-Schlüssel, V-Wert) verwenden, um sicherzustellen, dass keine Duplikate hinzugefügt werden.

    putIfAbsent gibt auch den vorhandenen Wert zurück, sodass Sie seinen hashCode erhalten können, der an Ihren Benutzer zurückgegeben wird.

    Siehe ConcurrentHashMap

    +1

    @Benjamin: Hash-Codes können nicht als numerische IDs verwendet werden, da sie nicht eindeutig zuzuordnen sind. – CPerkins