我有一个ImmutableSortedSet是在初始化类时创建的。对于此类的每个对象,我都希望ImmutableSortedSet具有存储在另一个文件中的Collection中的元素的深层副本(克隆)。

这是具有原始值的集合(也可以是集合)

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


这是我要使用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();
    }
}

最佳答案

首先,您没有解释如何获取Quest的副本,这是设计的一个方面。一般来说,我会写类似

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

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

09-28 07:29