문제점에 많은 수의 입력을로드해야하며 '입력 공간에 효율적으로 액세스 할 수있는 데이터 구조를 구축하는'문제 공간 ('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'변경 가능/불변의 객체 수명주기를 가능하고 가능한 한 '너무 귀엽다'고하지 않고 시행하기를 원합니다. 이 목표를 달성 할 수있는 더 좋은 방법에 대한 의견이나 피드백을 찾고 있습니다. 드물지만 사용 사례는 아니지만 지원하는 디자인 패턴을 찾을 수 없습니다.
감사합니다.
위대한 답에 감사드립니다. 이러한 대답을 바탕으로 구아바 ImmutableCollections 구현물을 살펴 보았습니다. '빌더 (builder)'패러다임은 변경 가능한 동반자 관용구와 매우 흡사합니다. 프로젝트의이 시점에서 노력할만한 가치가 있는지 판단하려고 노력하고 있습니다. 감사! – BrianV
꽤 좋은 토론이 여기에 : (http://codereview.stackexchange.com/questions/11538/comments-on-my-java-pattern-for-mutable-turned-immutable-objects) – BrianV