Ho una struttura dati che memorizza vari gruppi di permessi per un server di gioco multiplayer. Esiste un'istanza di una classe "Classifica" per ciascun gruppo di autorizzazioni. Ogni rango ha anche un nome. Devo essere in grado di accedere a tutti i ranghi sia in modo Iterable che con una chiave.
Ci sono tre modi principali in cui posso pensare di farlo. Non so quale sia il migliore in quanto hanno tutti pro e contro. Il primo metodo potrebbe avere un impatto significativo sulle prestazioni poiché il metodo getRank (String) verrà chiamato abbastanza spesso con un valore compreso tra 2 e 50 ranghi. Il secondo metodo potrebbe anche essere problematico in quanto vi sono diverse istanze, anche se non così comuni, in cui è utile avere un tale metodo con alte prestazioni. Il terzo metodo potrebbe essere problematico se la lista e la mappa non venissero mai sincronizzate, soprattutto perché ha bisogno di essere thread-safe.
Vorrei sapere quale metodo è il migliore e perché. La mia preoccupazione principale è che sia affidabile e performante.
Metodo # 1
public synchronized Rank getRank(String name) throws IllegalArgumentException{
for(Rank rank : ranks){
if(rank.getName().equalsIgnoreCase(name)){
return rank;
}
}
throw new IllegalArgumentException("Rank: " + name + " does not exist!");
}
Metodo n. 2:
public synchronized List<Ranks> getRanks(){
ArrayList<Ranks> ranksList = new ArrayList<Ranks();
for(String rankName : ranksMap.keySet()){
ranksList.add(ranksMap.get(rankName));
}
return Collections.unmodifiableList(ranksList); //unmodifiableList to prevent someone from trying to add or remove ranks by editing this list
}
Metodo n. 3:
public class RankList{
private ArrayList<Rank> list = new ArrayList<>();
private Map<String, Rank> map = new HashMap<>();
public void add(Rank rank){
list.add(rank);
map.put(rank.getName().toLowerCase(), rank);
}
public List<Rank> getRanks(){
return Collections.unmodifiableList(list);
}
public Rank get(String name){
return map.get(name.toLowerCase());
}
}