2012-02-04 6 views
0

여기 내 문제가 있습니다 ...은 인스턴스를 공유하지만 모든 새로운 프로세스에 대해 새로운 것을 생성합니다.

- 스타터, 데이터베이스 및 스케줄러 및 테스트 클래스가 4 개 있습니다.

테스트 클래스는 (전체 프로세스를로드하고 시작하는) 스타터의 새 인스턴스를 만듭니다. 스타터는 스케줄러 및 데이터베이스 클래스를 초기화합니다.

테스트 클래스는 데이터를 초보자에게 전달합니다. Starter는이를 Database 클래스의 HashMap에 저장합니다. 스케줄러는 데이터베이스 클래스에서 과 동일한 HashMap을 읽습니다. 이제

가 동일한 HashMap의 내 자바 프로젝트 전반에 걸쳐 모든 클래스에 의한 액세스가 있는지 확인하기 위해, 나는 2 options--이되는 HashMap에게 정적를하거나 데이터베이스 싱글 톤 클래스해야한다. 나는 Database를 현재 싱글 톤 클래스로 만들었다. 테스트 클래스이

스타터 starterInstance1 = 새로운 스타터 않으면 problem--

();

스타터 starterInstance2 = 새로운 스타터();

어떻게 starterInstance1과 starterInstance2에 Database 클래스 나 HashMap의 인스턴스가 있는지 확인하려면 어떻게해야합니까?

==========

그냥 더 명확되는 :

클래스 테스트 {

스타터 start1 = 새로운 스타터(); // 내 응용 프로그램의 한 인스턴스를 생성

start1.init(); //이 스케줄러 등을 초기화 할 것이다 "getDatabaseInstance()는"

찾는 (I = 0을 나타내는 int 난 < 50; 내가 ++) {,299,

start1.sendData ("abc"); //이 50 개의 요청은 모두 데이터베이스 클래스의 HashMap에 저장 될 요청을 보낼 스레드 풀에 제출됩니다. HashMap은 스케줄러 및 다른 클래스에 의해 동시에 액세스됩니다. 모든 클래스가 동일한 DB 인스턴스에 액세스 할 수 있도록 Database 클래스를 싱글 톤으로 만들었습니다.

}

// 마찬가지로 내 응용 프로그램의 다른 인스턴스를 생성

스타터 START2 = 새로운 스타터();

start2.init(); // "getDatabaseInstance()"를 수행하면 위와 같은 인스턴스가 생성됩니다. 하지만이 응용 프로그램 인스턴스에 대해 별도의 데이터베이스를 원합니다. 나는 이것을 어떻게 성취합니까? {

START2

찾는 (; 나는 < 50 난 ++ I = 0 INT).sendData ("abc");

}

}

+0

를 데이터베이스 싱글 인 경우, 나는 그들이 다른 인스턴스를 가질 수 표시되지 않습니다. 이것이 싱글 톤 패턴의 핵심입니다. 귀하의 질문 중 하나는 정확한지도가 모든 클래스에 의해 액세스되어야하고 다른 하나는 각각의 시동기 인스턴스가 자신의 인스턴스를 가져야한다고 말합니다. 원하는게 뭐야? –

+0

예 싱글 톤은 인스턴스가 1 개만있는 것을 의미합니다. 그러나 나는 그것을 원하지 않는다. 내 전체 응용 프로그램의 시작 지점은 초보자 클래스입니다. 응용 프로그램의 새 인스턴스 (예 : 새로운 Starter())가 생성 될 때마다 고유 한 데이터베이스와 동일한 데이터베이스에 액세스하는 고유의 스케줄러를 갖기를 원합니다. 데이터베이스를 싱글 톤 (singleton) 클래스로 만드는 것은 새로운 - 모든 Starter() - 동일한 데이터베이스를 사용할 것임을 암시하는 솔루션입니다. 나는 모든 새로운 Starter()가 그것 자신의 Database를 가지기를 원한다. – anzaan

답변

1

질문에 대한 가장 일반적인 대답은 아마 단순히 Database 자체에 대한 참조의 Starter 킵 트랙을 수 있도록하는 것입니다. 물론, Scheduler 같은 일을 할 것입니다 :

public class Starter { 
    Database db; 
    Starter(Database db) { 
     this.db = db; 
    } 
} 

/* ... */ 

Database db1 = new Database(); 
Starter starter1 = new Starter(db1); 
Scheduler scheduler1 = new Scheduler(db1); 

Database db2 = new Database(); 
Starter starter2 = new Starter(db2); 
Scheduler scheduler2 = new Scheduler(db2); 
+0

네, 이것은 한 가지 방법입니다. 그러나 제 신청은 좀 더 복잡합니다. TCP 연결을 통해 데이터를 전송하기 위해 mina nio 프레임 워크를 사용하고 있습니다. 나는이 응용 프로그램 전체에서이 데이터베이스의 인스턴스를 필요로 할 것입니다. 그래서 나는 모든 수업에 그것을 계속 전달할 수 없습니다. 또한 나는 그것을 클라이언트 쪽에서 SessionHandler에서 사용하고있다. 거기에 생성자 인수로 DB 인스턴스를 전달할 수 없습니다. thnx fr ur 제안 btw! – anzaan

+0

모든 스타터에 자체 스레드가없는 경우 (이 경우에 ThreadLocal에 데이터베이스를 저장할 수 있음) 다른 방법은 표시되지 않습니다. 데이터베이스 인스턴스에 액세스해야하는 클래스가 너무 많으면 캡슐화가 부족하고 디자인 문제가있을 수 있습니다. –

+0

나는 당신과 동의합니다. 나는 이것이 디자인 문제라고 확신한다. 하지만 나는 이미 깊은 목과 완성의 마감일에 목이입니다! ThreadLocal에 대해서만 설명 할 것입니다. 그 동안 디자인 패턴을 제안 할 수 있습니까? – anzaan

관련 문제