1

我正在创建几个将从数据库中收集数据的线程。

然而,在所有这些线程中,我需要一个对我的Database对象的本地引用,据我所知有两种方法可以做到这一点,或者我使用一个接口:

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

}

然后在每个 thead 类中手动设置变量(扩展命令接口)

但是,在进行测试和搜索时,我发现我可以执行以下操作:

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

这里有一个抽象类,我的每个线程对象都可以扩展它,然后创建一个构造函数来设置所需的变量。

我的问题很简单,这两种方法中哪一种是最佳实践?

4

2 回答 2

2

您不应仅根据共享某些代码或某些变量的需要来决定变量的放置。如果你的抽象类的设计理念是所有扩展它的东西都必须能够访问Database,那么你就放入Database基类。

另一方面,如果某些预期的实现与数据库无关,那么您不应该添加Database到抽象基类中。当然,您不仅限于继承层次结构的两个级别:您始终可以从commandtest没有的开始Database,然后为确实需要数据库的所有内容添加另一个级别的抽象类:

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 {
    ...
}
于 2013-04-30T14:34:15.047 回答
1

既然你这么说

在所有这些线程中,我将需要对我的数据库对象的本地引用

你的第二种方法似乎合适。我会将db变量声明为私有,因为每个线程都会有所不同(这就是我从你的问题中感受到的)。否则,在实现类之间共享可能是错误的。

private Database db;

并公开一个abstract setDatabase(Database database)方法,以便每个实现类设置其数据库。

于 2013-04-30T15:29:03.003 回答