2013-04-30 5 views
1

데이터베이스에서 데이터를 수집 할 여러 스레드를 생성 중입니다.다형성 및 지역 변수

public interface Command { 
void execute(); 
void collectData(); 
void processData(); 
void setData(ArrayList<Objects> data); 

}

: 내가이 일을 두 가지 방법이 있습니다 알고

그러나 이러한 모든 스레드에 나도 내가 인터페이스를 사용까지 내 Database 객체의 로컬 참조가 필요합니다 그리고 나서 각 thead 클래스 (명령 인터페이스를 확장하는)에서 수동으로 변수를 설정하십시오.

그러나 테스트와 검색을 통해 다음을 수행 할 수 있음을 발견했습니다.

public abstract class commandtest implements Runnable{ 
    Database db; 
    abstract void execute(); 
    abstract void collectData(); 
    abstract void processData(); 
    abstract void setData(ArrayList<Objects> data); 
} 

여기에는 각각의 스레드 객체가 확장 할 수 있고 필요한 변수를 설정하는 생성자를 만들 수있는 추상 클래스가 있습니다.

제 질문은이 두 가지 방법 중 어느 것이 가장 좋은 방법인가요?

+0

"최상의"것은 없으며 "상황에 가장 적합한"것이 있습니다. –

+0

@DaveNewton 어떻게 결정합니까? 어떤 요소를 고려해야합니까? –

+1

나는 인터페이스를 선언하고'protected Database db' 속성을 가진 인터페이스를 구현하는 추상 클래스를 가질 것입니다. –

답변

2

일부 코드 또는 일부 변수를 공유해야 할 필요성만으로 변수 배치를 결정해서는 안됩니다. 추상 클래스가 그것을 확장하는 모든 것이 Database에 액세스 할 수 있어야한다는 생각으로 설계된 경우 Database을 기본 클래스에 넣습니다.

반면에 의도 된 구현 중 일부가 데이터베이스와 아무 관련이없는 경우 Database을 추상 기본 클래스에 추가하면 안됩니다. 물론 당신은 상속 계층 구조의 두 레벨로 제한되지는 않는다 : 당신은 항상 Database을 가지고 있지 않는 commandtest로 시작하고 데이터베이스 필요합니까 모든 것을 추상 클래스의 또 다른 레벨을 추가 할 수 있습니다

abstract class AbstractCommandTest { 
    abstract void execute(); 
    abstract void collectData(); 
    abstract void processData(); 
    abstract void setData(ArrayList<Objects> data); 
    // Other methods shared by all commands 
} 
abstract class AbstractDatabaseCommandTest extends AbstractCommandTest { 
    protected Database db; 
    protected AbstractDatabaseCommandTest(Database db) { 
     this.db = db; 
    } 
} 
class SomeCommandThatDoesNotNeedDatabase extends AbstractCommandTest { 
    ... 
} 
class DatabaseCommand1 extends AbstractDatabaseCommandTest { 
    ... 
} 
class DatabaseCommand2 extends AbstractDatabaseCommandTest { 
    ... 
} 
1

이후를 당신이

이 모든 스레드에 난 내 데이터베이스 객체의 로컬 참조가 필요합니다라고

두 번째 접근 방식은 아프로 보인다 사제. db 변수는 스레드별로 다를 것이므로 (이 질문은 사용자의 질문에서 느낀 것입니다) 개인용으로 선언 할 것입니다. 그렇지 않으면 클래스를 구현할 때 실수로 공유 될 수 있습니다.

private Database db; 

을 노출하고 각 구현 클래스가 데이터베이스를 설정하도록합니다.

+1

재밌게 다시 보았을 때 나는 그것을 멋지게 발견했습니다. –