2016-04-26 11 views
0

Ich arbeite an einem Programm. Ich habe Benutzer in einer ArrayList gespeichert, also hatte ich eine UserCollection-Klasse, die als Speicherklasse für die Benutzer fungiert. Aber da die UserCollection als "Datenbank" betrachtet wird, sollte jeder Benutzereintrag in der Datenbank eine eindeutige ID haben. Anfangs hatte ich eine Benutzer-ID als Feld in der User-Klasse, aber jetzt versuche ich, den ID-Teil in der UserCollection zu behandeln. Wenn ich eine Hashmap verwenden würde, wo der Schlüssel die ID wäre, wäre der Wert der Benutzer, wie würde ich fortfahren, die ID zu wiederholen, so dass jedes Mal, wenn ein neuer Benutzer in der Hashmap gespeichert wird, der Schlüssel von 1 nach iteriert n Anzahl der Benutzer. Ich verwende auch CRUD-Methoden, um die Benutzer zu speichern/entfernen/zu aktualisieren.So speichern Sie ein bestimmtes Objekt in HashMap mit Iteration ID als Schlüssel

public class UserCollection{ 

Map<Integer, User> userMap = new HashMap<Integer,User>(); 

public User create(User user){ 
userMap.put(??,user) // not sure how to iterate the id or what to put in it 
return user; 
} 

public User read(Integer keyID){ 
    if(userMap.containsKey(keyID)){ 
    return userMap.get(keyID); //something definitely wrong 
    } 
} 

//Other remaining CRUD methods after. 

} 

Ursprünglich hatte ich nur eine ArrayList, die Benutzer hielt. Aber weil ich in einer Datenbank realisierte, dass Benutzer einzigartige IDs haben werden, bin ich verwirrt, wie ich mit ihnen umgehen würde. Wenn ich sie in der HashMap behandle muss ich noch ein Benutzer-ID-Feld in der Benutzerklasse haben?

Antwort

0

Sie können Folgendes tun, um sicherzustellen, dass Ihre Benutzer eine eindeutige ID für die Lebensdauer der Klasse haben.

public class UserCollection 
{ 
    private static int id = 0; 
    private static final Object lock = new Object(); 

    private Map<Integer, User> userMap = new HashMap<Integer,User>(); 

    public User create (User user) 
    { 
    // only add one user at a time to the map 
    synchronized (lock) 
    { 
     id++; 
     userMap.put(id, user); 
    } 
    return user; 
    } 

    // Rest of the class 
} 
1

Sie haben hier ein paar Fragen gestellt. Ich nehme jede von ihnen der Reihe nach:

  1. Wie kann ich sicherstellen, dass jeder Benutzer eine eindeutige ID hat?

Der einfachste Weg, dies zu tun, ist ein statisches Feld zu haben, die Spur der größten erzeugten ID hält:

class User { 
    private static int largestID = 0; 
    private final int id = largestID++; 

    public int getID() { 
     return id; 
    } 
    ... 
} 

Das funktioniert aber viele Probleme mit ihm hat. Sobald Sie die Benutzer & speichern, das Programm neu starten oder IDs erneut verwenden möchten, muss es geändert werden.

Ein anderer Ansatz besteht darin, nur die größte ID für bestehende Kunden aus Ihrer Sammlung zu finden. Der folgende Beispielcode verwendet Java 8:

Dies ist ineffizient, aber wahrscheinlich gut genug für viele Anwendungen.

  1. Muss ich die ID in der Benutzerklasse speichern?

Sie haben zwei Möglichkeiten. Entweder Sie speichern es in der Klasse und bieten einen Mechanismus zum Abrufen der ID (wie oben). Oder Sie stellen sicher, dass alles, was mit Benutzern zu tun hat, IDs und keine Referenzen auf Objekte speichert und zurückgibt. Dies ermöglicht dem Client der Methode, dann unter Verwendung der ID auf den Benutzer zuzugreifen.

Beide sind legitime Lösungen. Wenn Sie die ersten verwenden (die ID in der Klasse zu speichern), dann sollten Sie Ihre Methode für ändern, um einen Benutzer zu Ihrer Sammlung hinzufügen:

class UserCollection { 
    public void addUser(User user) { 
     users.put(user.getID(), user); 
    } 
} 

Wenn Sie die zweite verwenden, muss das ID-Feld endgültig, da die Kunden angewiesen sind daran ändert sich nicht.

Verwandte Themen