2017-05-11 3 views
0

J'ai un ImmutableSortedSet qui est créé lors de l'initialisation d'une classe. Pour chaque objet de cette classe je veux que l'ImmutableSortedSet ait une copie profonde (clone) des éléments stockés dans une collection située dans un autre fichier.Créer une copie profonde d'une collection à un ImmutableSortedSet lors de l'initialisation d'une classe en Java

C'est la collection avec les valeurs d'origine (pourrait aussi être un jeu)

public static final List<Quest> QUESTS = new ArrayList<>(); 

Ceci est la classe que je veux créer avec le ImmutableSortedSet

package com.vencillio.rs2.content.quest; 

import java.util.Optional; 
import java.util.Set; 

import com.google.common.collect.ImmutableSortedSet; 

public class QuestManager { 

    private int questPoints = 0; 
    private final Set<Quest> QUESTS = ImmutableSortedSet.copyOf(Quest.QUESTS); //This is only a shallow copy 

    public int getQuestPoints() { 
     return questPoints; 
    } 

    public void addQuestPoints(int amount) { 
     questPoints += amount; 
    } 

    public void removeQuestPoints(int amount) { 
     questPoints -= amount; 
    } 

    public Optional<QuestState> getQuestState(String name) { 
     return getQuest(name).isPresent() ? Optional.of(getQuest(name).get().getQuestState()) : Optional.empty(); 
    } 

    public void setQuestState(String name, QuestState state) { 
     if(getQuest(name).isPresent()) 
      getQuest(name).get().setQuestState(state); 
    } 

    public Optional<Quest> getQuest(String name) { 
     return QUESTS.stream().filter(quest -> quest.getName().equalsIgnoreCase(name)).findAny(); 
    } 
} 

Répondre

1

Vous ne l'avez pas expliqué comment pour obtenir une copie d'un Quest en premier lieu, qui est un aspect de votre conception. En général, j'écrirais quelque chose comme

import static com.google.common.collect.ImmutableSortedSet.toImmutableSortedSet; 
import static java.util.Comparator.naturalOrder; 

Quest.QUESTS.stream() 
    .map(quest -> copy(quest)) 
    .collect(toImmutableSortedSet(naturalOrder())); 
+0

'Quête' Implémente l'interface Clonable pour obtenir une copie. J'ai utilisé ce que vous m'avez donné et je l'ai fait essentiellement, que devrais-je mettre pour l'argument du comparateur dans 'ImmutableSortedSet'. Ma classe Quest implémente Comparable et Comparateur mais comment puis-je utiliser le comparateur de cette classe si elle est abstraite? – Metorrite

+0

Rien ne doit implémenter 'Comparator' et' Comparable'. _Never._ Si vous voulez utiliser l'ordre naturel 'Comparable', alors utilisez exactement ce que j'ai écrit, car il utilise l'ordre naturel. Si vous voulez utiliser un 'comparateur ', alors faites une autre classe, puis passez le dans le code que j'ai écrit ci-dessus au lieu de' naturalOrder() '. –

+0

'ImmutableSortedSet.naturalOrder()' renvoie un type de générateur où 'ImuutableSortedSet.toImmutableSortedSet()' demande un type de comparateur. Que devrait-on mettre là? Merci pour votre aide, très éclaircissante. – Metorrite