2017-05-11 13 views
0

클래스 초기화시 생성되는 ImmutableSortedSet이 있습니다. 이 클래스의 모든 객체에서 ImmutableSortedSet에 다른 파일에있는 Collection에 저장된 요소의 딥 복사 (복제)를 원합니다. Java에서 클래스 초기화시 ImmutableSortedSet에 대한 콜렉션의 전체 복사본 만들기

은 원래 값 컬렉션 (도 될 수있는 세트)

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(); 
    } 
} 

답변

1

로 만들려는 클래스입니다입니다 처음에 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())); 
+0

'Quest'복사본을 얻기 위해 Cloneable 인터페이스를 구현합니다. 나는 당신이 내게 준 것을 사용했고 본질적으로 그것을 얻었습니다. 'ImmutableSortedSet'에 Comparator 인수를 넣어야합니다. 내 퀘스트 클래스는 과 비교기 을 구현하지만 추상적 인 경우 해당 클래스의 비교자를 어떻게 사용할 수 있습니까? – Metorrite

+0

'Comparator'와 'Comparable'을 모두 구현해야하는 것은 없습니다. _Never. _ 'Comparable' 자연 순서를 사용하려면 자연 순서를 사용하기 때문에 내가 쓴 것과 똑같은 것을 사용하십시오. 'Comparator'를 사용하고 싶다면, 다른 클래스를 만들고,'naturalOrder()'대신 위에 쓴 코드에 그것을 넘겨 줘라. –

+0

'ImmutableSortedSet.naturalOrder()'는'ImuutableSortedSet.toImmutableSortedSet()'이 비교 자의 타입을 요구하고있는 빌더 타입을 반환합니다. 무엇을 거기에 두어야합니까? 도와 주셔서 감사합니다. – Metorrite