2012-10-24 2 views
4

문제점에 많은 수의 입력을로드해야하며 '입력 공간에 효율적으로 액세스 할 수있는 데이터 구조를 구축하는'문제 공간 ('problem space')을 만들기 위해 해당 입력을 처리해야하는 문제에 대한 작업을하고 있습니다.). 이 초기화가 완료되면 다중 스레드 프로세스가 시작되어 조직화 된/처리 된 입력을 동시 적으로 광범위하게 사용합니다.Java Popsicle 변경 불가능

성능상의 이유로 동시 병기에서 모든 읽기 작업을 잠그고 동기화하고 싶지 않습니다. 필자가 진정으로 원하는 것은 불변의 객체로, 여러 독자가 동시에 액세스 할 수 있습니다.

실용적인 이유로 (난독성 & 유지 관리 용이) InputManager를 참된 불변 객체 (즉, 모든 필드 'final'및 구성시 초기화 됨)로 만들고 싶지 않습니다. InputManager는 수많은 데이터 구조 (목록 및 맵)를 가지며, 각 객체는 서로에 대한 순환 참조가 많습니다. 이 객체들은 '참인'불변 객체로 구성됩니다. InputManager에 대해 14 개의 인수 생성자를 갖고 싶지는 않지만 일단 생성 된 문제 공간의 일관된 읽기 전용 뷰를 제공하려면 InputManager 클래스가 필요합니다. 에릭 Lippert의 논의로

는 내가 갈거야하는 '아이스 캔디 불변'이다 here. 내가 데려 갈거야 접근 방식은 모든 변경 가능한 조치를 모두 돌연변이 방법의 '패키지 가시성 (visibility)'를 사용하고, 수행에 의존

(즉, 단일 패키지 내에서 InputManager의 생성). Getters는 모두 대중에게 공개됩니다.

뭔가 같은 : 내가 충분히 명확하지 않은 경우

public final class InputManager { // final to prevent making mutable subclasses 
    InputManager() { ... } //package visibility limits who can create one 
     HashMap<String,InputA> lookupTable1; 
     ... 

    mutatingMethodA(InputA[] inputA) { //default (package visibility) 
     //setting up data structures... 
    } 

    mutatingMethodB(InputB[] inputB) { //default (package visibility) 
     //setting up data structures... 
    } 

    public InputA getSpecificInput(String param1) { 
     ... //access data structures 
     return objA; //return immutable object 
    } 
} 

전체 아이디어, 그때, 단일 스레드에서 InputManager를 구성 동시 할 것입니다 여러 스레드에 전달할 것이다 객체를 사용하여 작업하십시오. 나는이 'two-phase'변경 가능/불변의 객체 수명주기를 가능하고 가능한 한 '너무 귀엽다'고하지 않고 시행하기를 원합니다. 이 목표를 달성 할 수있는 더 좋은 방법에 대한 의견이나 피드백을 찾고 있습니다. 드물지만 사용 사례는 아니지만 지원하는 디자인 패턴을 찾을 수 없습니다.

감사합니다.

답변

1

개인적으로 나는 당신의 간단하고 충분한 접근 방식을 유지할 것이지만, 관심이있는 경우에는 변경 가능한 동반자 관용구가 있습니다. 내부 인스턴스 인 내부 클래스에는 모든 필드와 getter를 재사용하면서 mutator가 있습니다.

변경 가능한 동반자를 잃 자마자 뒤에 남겨지는 인클로저 인스턴스는 진정으로 변경되지 않습니다.

+0

위대한 답에 감사드립니다. 이러한 대답을 바탕으로 구아바 ImmutableCollections 구현물을 살펴 보았습니다. '빌더 (builder)'패러다임은 변경 가능한 동반자 관용구와 매우 흡사합니다. 프로젝트의이 시점에서 노력할만한 가치가 있는지 판단하려고 노력하고 있습니다. 감사! – BrianV

+0

꽤 좋은 토론이 여기에 : (http://codereview.stackexchange.com/questions/11538/comments-on-my-java-pattern-for-mutable-turned-immutable-objects) – BrianV

1

두 단계에 대해 별도의 인터페이스를 간단하게 사용할 수 있다고 생각합니다. 하나는 건물 부분을위한 것이고 다른 하나는 독서 부분을위한 것입니다. 이렇게하면 액세스 패턴이 깔끔하게 분리됩니다. 이것을 interface segregation principle (pdf)의 인스턴스로 볼 수 있습니다.

클라이언트는 사용하지 않는 인터페이스에 의존해서는 안됩니다.

+1

나는 별도의 인터페이스에 대한 아이디어를 좋아하고 pdf에 대한 포인터를 높이 평가합니다. 감사. – BrianV

+0

@BrianV : 환영합니다! –

1

개체가 안전하게 게시되고 독자가이를 변경할 수없는 한.

"게시"는 작성자가 개체를 독자에게 제공하는 방법을 의미합니다. 예를 들어, 작성자는 블로킹 큐에 넣고 독자는 큐를 폴링합니다.

귀하의 게시 방법에 따라 다릅니다. 나는 그것이 안전한 것이라고 내기 할 것이다.

+0

의견을 감사드립니다. 게시 방법이 적절한 지 확인합니다. – BrianV